首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言關鍵字深度解析:restrict、const、volatile

     編輯:關於C

1. restrict:編譯器優化的契約

背景動機

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才能充分優化。

2. const:只讀承諾

基本規則

  • 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;,每文件一份拷貝,適合小常量。

3. volatile:防止過度優化

核心含義

告訴編譯器:該變量可能被程序外部代理(硬件、中斷、其他線程)修改,每次讀取必須從內存獲取,不可緩存寄存器值。

典型場景

  • 硬件寄存器映射地址:volatile int *hw_reg;
  • 多線程共享標誌:volatile int flag;(注意:volatile不保證原子性/內存序,需配合原子操作/鎖)。
  • const volatile:只讀硬件狀態寄存器(如實時時鐘)。

經典多線程陷阱

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved