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

I find headSTRUCTSIZE is defined as a const variable, but my compiler always optimizate it. I have check the disassemble file os heap5.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 uint16t heapSTRUCTSIZE = ( ( sizeof ( BlockLinkt ) + ( portBYTEALIGNMENT – 1 ) ) & ~portBYTEALIGNMENTMASK ); 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

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

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.

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

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.