Why FreeRTOS defines heapSTRUCT_SIZE as a const variable rather than a macro?

realsil wrote on Monday, April 13, 2015:

I find headSTRUCT_SIZE is defined as a const variable, but my compiler always optimizate it.
I have check the disassemble file os heap_5.o, and I found the code “puc -= heapSTRUCT_SIZE;” is translated into “SUBS r4,r4,#8” automatically.

Is there any difference between “define heapSTRUCT_SIZE as a const variable” and “define heapSTRUCT_SIZE as a macro”?

static const uint16_t heapSTRUCT_SIZE = ( ( sizeof ( BlockLink_t ) + ( portBYTE_ALIGNMENT - 1 ) ) & ~portBYTE_ALIGNMENT_MASK );

void vPortFree( void *pv , RAM_TYPE ramType)
{
uint8_t *puc = ( uint8_t * ) pv;
BlockLink_t *pxLink;

 if( pv != NULL )
 {
            /* The memory being freed will have an BlockLink_t structure immediately
            before it. */
            puc -= heapSTRUCT_SIZE;

            /* This casting is to keep the compiler from issuing warnings. */
            pxLink = ( void * ) puc;

/* ignore some lines */
}

vPortFree PROC
PUSH {r4-r6,lr}
MOV r5,r1
MOV r4,r0
CMP r0,#0
BEQ |L1.720|
SUBS r4,r4,#8

davedoors wrote on Monday, April 13, 2015:

If you use a macro with low or no compiler optimization it will be calculated each time it is used. If you use a const then it is calculated when you compile the program.

realsil wrote on Monday, April 13, 2015:

Dear Dave,

I think the fact is always the opposite. If we use a const and close the compiler’s optimization, some variable reference this const may calculated everytime when program run.