C中的volatile關鍵字

2021-10-01 09:45:23 字數 1053 閱讀 9762

volatile是c中的關鍵字,一般在嵌入式中用的比較多,其用來解決變數在「共享」環境下容易出現讀取錯誤的問題。若變數被定義為volatile,則代表著該變數可能會被意想不到的改變,即在程式執行過程中一直變,這個值每次被處理時,都要從記憶體中讀取該值,而不會因編譯器優化從快取的地方讀取(比如說讀取快取在暫存器中的數值),從而保證volatile變數被正確讀取。先看下面的**:

int

main()

// 這個時候會發現x並沒有改變,對x變數加上volatile關鍵字修飾後發現改變了。

// (1)區域性const常變數是可以被改變的,但是全域性const常變數不可以被修改,這個後面會單獨講

// (2)區域性const常變數被優化放在暫存器中,所以沒加volatile時依舊從暫存器中訪問,即使記憶體值被改變了

在單任務環境中,如果乙個函式體內部兩次讀取變數值之間的語句沒有對變數進行修改,那麼編譯器就會設法對可執行**進行優化。由於訪問暫存器的速度要比從ram中讀取變數的值到暫存器中要快,所以以後只要變數的值沒有改變,就一直從暫存器中讀取變數的值,而不對ram進行訪問。

而在多工環境中,雖然乙個函式體內部在兩次讀取變數值之間沒有對變數進行修改,但是該變數仍然有可能被其它的程式(如中斷程式,其它執行緒等)修改,如果這時還是從暫存器而不是從ram中進行讀取,就會出現被修改的變數值不能及時得到反映的問題。見下面的**:

int

main()

int b = i;

cout << i << endl;

}// **在vs2017 relaese版本下,輸出10,10,加上volatile關鍵字後輸出10, 80

// [ebp-4] 表示的是i的儲存單元,因為ebp是擴充套件基址指標暫存器,存放函式所屬棧的棧底位址,所以先入棧,佔4個位元組。隨函式內宣告的區域性變數增多,esp棧指標就會相應減小,因為棧的生長方向由高位址向低位址生長。i為第乙個變數,棧空間已被ebp入棧占用了4個位元組,所以i的位址就是ebp-4。

參考資料

(1)《c++高階心法》

C 中volatile關鍵字

volatile 限定符告知計算機,而不是變數所在的程式 可以改變該變數的值。通常,它被用於硬體位址以及在其他程式或者同時執行的執行緒中共享資料。例如,乙個位址上可能儲存著當前的始終時間,無論程式做什麼,位址上的值都隨著時間的變化而變化。或者乙個位址用於接受另一台計算機傳入的資訊。volatile的...

C 中的 volatile 關鍵字

volatile關鍵字表示字段可能被多個併發執行執行緒修改。宣告為 volatile 的字段不受編譯器優化 假定由單個執行緒訪問 的限制。這樣可以確保該字段在任何時間呈現的都是最新的值。volatile修飾符通常用於由多個執行緒訪問而不使用 lock 語句 c 參考 語句對訪問進行序列化的字段。有關...

C 中的 volatile 關鍵字

volatile關鍵字表示字段可能被多個併發執行執行緒修改。宣告為 volatile 的字段不受編譯器優化 假定由單個執行緒訪問 的限制。這樣可以確保該字段在任何時間呈現的都是最新的值。volatile修飾符通常用於由多個執行緒訪問而不使用 lock 語句 c 參考 語句對訪問進行序列化的字段。有關...