1. 程式人生 > >C語言volatile關鍵字—最易變的關鍵字

C語言volatile關鍵字—最易變的關鍵字

volatile 是易變的、不穩定的意思。很多人根本就沒見過這個關鍵字,不知道它的存在。也有很多程式設計師知道它的存在,但從來沒用過它。我對它有種“楊家有女初長成,養在深閨人未識” 的感覺。

volatile 關鍵字和const 一樣是一種型別修飾符,用它修飾的變量表示可以被某些編譯器未知的因素更改,比如作業系統、硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的程式碼就不再進行優化,從而可以提供對特殊地址的穩定訪問。

先看看下面的例子:
   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 可以保證對特殊地址的穩定訪問。

但是注意:在VC++6.0 中,一般Debug 模式沒有進行程式碼優化,所以這個關鍵字的作用有可能看不出來。你可以同時生成Debug 版和Release 版的程式做個測試。


留一個問題:const volatile int i=10;這行程式碼有沒有問題?如果沒有,那i 到底是什麼屬性?