C語言允許指針別名,導致編譯器難以優化。例如:
void *memcpy(void *restrict s1, const void *restrict s2, size_t n); // 假定不重疊 void *memmove(void *s1, const void *s2, size_t n); // 允許重疊
加上restrict後,GCC -O2可消除冗餘加載,生成更緊湊匯編碼。但編譯器仍可能保守(如參數類型不同時),需所有相關指針均加restrict才能充分優化。
const int *p / int const *p:指向常量的指針(值不可變,指針可變)。int *const p:常量指針(指針不可變,值可變)。const int *const p:雙重常量。.c中定義const double PI=3.14;,.h中extern const double PI;。static const double PI=3.14;,每文件一份拷貝,適合小常量。告訴編譯器:該變量可能被程序外部代理(硬件、中斷、其他線程)修改,每次讀取必須從內存獲取,不可緩存寄存器值。
volatile int *hw_reg;volatile int flag;(注意:volatile不保證原子性/內存序,需配合原子操作/鎖)。const volatile:只讀硬件狀態寄存器(如實時時鐘)。