volatile
volatile : (意思是不穩定的)限定乙個物件可被外部程序(作業系統、硬體或併發執行緒等)改變,宣告時的語法如下:
int volatile nvint
; 這個說明 讓程式每次讀取nvint 真正的值。
volatile
int i=10;
int a = i;..
.// 這裡的**可能回改變i 的值
// 其他**,並未明確告訴編譯器,對 i 進行過操作
int b = i;
在上面 volatile 指出 i 是隨時可能發生變化的,每次使用它的時候必須從 i的位址中讀取,因而編譯器生成的彙編**會重新從i的位址讀取資料放在 b 中。而優化做法是,由於編譯器發現兩次從 i讀資料的**之間的**沒有對 i 進行過操作,它會自動把上次讀的資料放在 b 中。而不是重新從 i 裡面讀。這樣以來,如果i是乙個暫存器變數或者表示乙個埠資料就容易出錯(就是直接定義int i = 10;
),所以說 volatile 可以保證對特殊位址的穩定訪問。
像上面這種宣告方式,是不能達到最高效的,因為它們的值隨時會改變,系統在需要時會經常讀寫這個物件的值。因此常用於像中斷處理程式之類的非同步程序進行記憶體單元訪問。
#include
void
main()
int b = i;
printf
("i = %d"
, b)
;}
上面的**只能在vc 上的才能執行出效果,我在vs2017上試過,都是經過編譯器優化後的值。下面是加了volatile 關鍵字後,下面**是在老版編譯器上,說明一下。在vc 中的 debug 版本模式執行程式,輸出結果如下:
i = 10
i = 32
在 release
版本模式執行程式,輸出結果如下:
i = 10
i = 10
#include
void
main()
int b = i;
printf
("i = %d"
, b)
;}
分別在 debug 和 release 版本執行程式,輸出都是:哪樣的崗位喜歡考查這個關鍵字呢?i = 10
i = 32
在我看來,學習嵌入式程式設計,有些面試官就喜歡出這個關鍵字。關鍵字volatile有什麼含意? 這裡有三個場景。
volatile的本意是「易變的」 由於訪問暫存器的速度要快過ram,所以編譯器一般都會作減少訪問外部ram的優化,但有可能會讀髒資料。當要求使用volatile 宣告的變數的值的時候,系統總是重新從它所在的記憶體讀取資料,即使它前面的指令剛剛從該處讀取過資料。而且讀取的資料立刻被儲存。
精確地說就是,優化器在用到這個變數時必須每次都小心地重新從記憶體裡讀取這個變數的值,而不是使用儲存在暫存器裡的備份。 下面是volatile變數的幾個例子:
並行裝置的硬體暫存器(如:狀態暫存器)
乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables)
多執行緒應用中被幾個任務共享的變數
一般地,volatile用在如下的幾個地方:
中斷服務程式中修改的供其它程式檢測的變數需要加volatile;
多工環境下各任務間共享的標誌應該加volatile;
儲存器對映的硬體暫存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義;
關鍵字 volatile關鍵字的作用
1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...
volatile關鍵字作用
1.阻止編譯器對 進行優化。即讀取某個變數值時,不從暫存器中讀取而是從變數裡讀。2.編譯器的優化 在本次執行緒內,當讀取乙個變數時,為提高訪問速度,編譯器優化時有時會先把變數讀取到乙個暫存器中 以後再取變數值時,就直接從暫存器中取值 當變數值在本執行緒裡改變時,會同時把變數的新值copy到該暫存器中...
volatile關鍵字的作用
在c c 語言中經常會遇到volatile關鍵字,它的字面意思是 可變的 不穩定的 volatile 會影響編譯器編譯的結果,被volatile修飾的變數是隨時可能發生變化的,編譯器對volatile變數有關的運算,不進行編譯優化,以免出錯,vc 在產生release版可執行碼時會進行編譯優化,加v...