1. 程式人生 > >[CareerCup] 13.5 Volatile Keyword 關鍵字volatile

[CareerCup] 13.5 Volatile Keyword 關鍵字volatile

13.5 What is the significance of the keyword "volatile" in C

這道題考察我們對於關鍵字volatile的理解,顧名思義,volatile有易變的易揮發的意思,在C/C++裡,表示告知編譯器某個變數可能會由程式外部改變,比如作業系統,硬體或者其他的執行緒。由於變數會由無法預期的改變,所有編譯器每次都需要從記憶體中讀取變數值。我們可以如下定義一個整型變數為volatile:

int volatile x;
volatile int x;

當然我們也可以定義一個指標變數:

volatile int *x;
int volatile
*x;

volatile 的變數不會被優化,這很有用,看下面的程式碼:

int opt = 1;
void Fn(void) {
    start:
        if (opt == 1) goto start;
        else break;
}

乍看上去,上面的程式是死迴圈的,編譯器會自動進行如下優化:

void Fn(void) {
    start:
        int opt = 1;
        if (true) goto start;
        else break;
}

這樣的確是個死迴圈,但是外部的操作想要給區域性變數opt賦值0,這樣可以跳出迴圈。

為了防止編譯器進行上述的優化,我們想要從外部改變引數值,從而控制迴圈。我們通過加volatile關鍵字來做:

volatile int opt = 1;
void Fn(void) {
    start:
        if (opt == 1) goto start;
        else break;
}

votlatile變數在多執行緒程式中有全域性變數且每個執行緒可以改變共享值時非常有用,我們不想這些共享變數被優化。