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 到底是什么屬性?
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 到底是什么屬性?