使用volatile是禁止編譯器對**進行優化,因為這個變數是易變的。其實這是乙個老生常談的話題了,三個常用的例子就是:
1)並行裝置的硬體暫存器(如:狀態暫存器)
2)乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables,如static變數)
3)多執行緒應用中被幾個任務共享的變數
易變是因為外在因素引起的,像中斷,像多執行緒等,
首先說下中斷(即上面的第2)個例子)假設有這麼乙個程式:
static int i = 0;
int main(void)
}/*interrupt service routine.*/
void isr_2(void)
程式的本意是希望當isr_2中斷發生時,在main中呼叫dosomething函式,但是,由於編譯器判斷在main函式裡面沒有修改過i,因為可能只執行一次從i到某暫存器的讀操作(由於訪問暫存器的速度要快過ram,所以編譯器一般都會作減少訪問外部ram的優化),然後每次if判斷都只使用這個暫存器裡面的副本,導致dosomething永遠也不會被呼叫。此時就需要在i變數前加上volatile,來保證對此變數的讀寫操作都不會被優化。
對於上面的第1)個例子:並行裝置的硬體暫存器,例如狀態暫存器,某個變數和外部裝置的某個狀態相對應,當外部裝置發生操作的時候,通過驅動程式和中斷事件,系統改變了這個變數的值,如果說,我們把這個變數提前緩衝到了cache或者cpu內部的暫存器之中,那麼外部裝置對這個狀態所做的改變我們的程式就無法發現了。
對於第3)個例子,在多執行緒程式中,多個執行緒共享的變數,由於多個執行緒都有可能對這個變數做出修改,所以每次讀取變數的時候都要非常小心從記憶體中去讀取才能保證程式的正確性。
C語言volatile關鍵字
volatile 是易變的 不穩定的意思。很多人根本就沒見過這個關鍵字,不知道它的存在。也有很多程式設計師知道它的存在,但從來沒用過它。我對它有種 楊家有女初長成,養在深閨人未識 的感覺。volatile 關鍵字和const 一樣是一種型別修飾符,用它修飾的變數表示可以被某些編譯器未知的因素更改,比...
C語言關鍵字volatile
volatile修飾變數表示該變數易受外界影響發生改變,volatile強烈要求編譯器每次對變數進行訪問都要從記憶體中進行 int a 10 b a c b 當編譯器掃到第一行時10賦給了a 自後a變數的值沒有發生改變,a賦給了b,b賦給了c 由於cpu訪問記憶體的速度較慢,編譯器為了提高效率,直接...
C語言關鍵字 volatile
volatile關鍵字 用法 1 告訴編譯器不做任何優化 2 表示用volatile定義的變數會在程式外被改變,每次都必須要從記憶體中讀取,而不能把它放在cache或暫存器中重複使用 volatile是告訴編譯器對它所修飾的物件別執行優化。volatile在進行多執行緒程式設計時要注意,而在單執行緒...