1. 程式人生 > >C語言複習筆記(3)——volatile

C語言複習筆記(3)——volatile

volatile的解釋:禁止優化

對,對於volatile的解釋,我認為只需要四個字——“禁止優化”。在單個執行緒內,volatile的訪問不會被編譯器優化掉,將會直接通過其記憶體地址訪問,確保得到的值是“最即時”的值。

關於使用的幾個注意點

1.C 型別系統中每一個獨立的型別都有數個該型別的限定版本(不同限定版本的型別可以認為是不同的型別),對應volatile,const及指標的restrict限定符中的一個、兩個或全部三個。
2.隱式轉換可以新增volatile限定符,但是不能丟棄volatile限定符

int* p = 0;
volatile int* vp = p; // OK:新增限定符( int 到 volatile int)
p = vp; // 錯誤:丟棄限定符( volatile int 到 int)
p = (int*)vp; // OK:型別轉換

3.指向T的二重不可轉換成指向volatile T的二重指標;對於要相容的兩個型別,它們的限定必須相同:

char *p = 0;
volatile char **vpp = &p; // 錯誤: char* 和 volatile char* 不是相容型別
char * volatile *pvp = &p; // OK,新增限定符( char* 到 char* volatile )

備註:關鍵詞volatile可以出現於方括號內,用以宣告函式引數的陣列型別。它對陣列所轉換得的指標型別賦予限定。

下列兩個宣告宣告同一函式:

void f(double x[volatile], const double y[volatile]);
void f(double * volatile x, const double * volatile y);

常用情景

  1. 並行裝置的硬體暫存器(如:狀態暫存器)
  2. 一箇中斷服務子程式中會訪問到的非自動變數(Non-automatic variables)
  3. 多執行緒應用中被幾個任務共享的變數