violate 修飾的用法

 一個定義爲volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值(From Memory),而不是使用保存在寄存器裏的備份。

下面是volatile變量的幾個例子:

1) 並行設備的硬件寄存器(如:狀態寄存器)

2) 一箇中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)

3) 多線程應用中被幾個任務共享的變量

這個多用在嵌入式開發中,一般場合不需要使用。

 

先看看下面的例子:
int i=10;
int j = i;//(1)語句
int k = i;//(2)語句
這時候編譯器對代碼進行優化,因爲在(1)、(2)兩條語句中,i 沒有被用作左值。這時候編譯器認爲i 的值沒有發生改變,所以在(1)語句時從內存中取出i 的值賦給j 之後,這個值並沒有被丟掉,而是在(2)語句時繼續用這個值給k 賦值。編譯器不會生成出彙編代碼重新從內存裏取i 的值,這樣提高了效率。但要注意:(1)、(2)語句之間i 沒有被用作左值才行。

 

再看另一個例子:
volatile int i=10;
int j = i;//(3)語句
int k = i;//(4)語句
volatile 關鍵字告訴編譯器i 是隨時可能發生變化的,每次使用它的時候必須從內存中取出i的值,因而編譯器生成的彙編代碼會重新從i 的地址處讀取數據放在k 中。這樣看來,如果i 是一個寄存器變量或者表示一個端口數據或者是多個線程的共享數據,就容易出錯,所以說volatile 可以保證對特殊地址的穩定訪問。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章