C語言volatile關鍵字

2021-08-09 02:48:14 字數 1340 閱讀 5286

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

,因為程式不應該試圖去修改它。

volatile和const並不矛盾,只是控制的範圍不一樣,乙個在程式本身之外,另乙個是程式本身。

一般說來,volatile用在如下的幾個地方:

1、中斷服務程式中修改的供其它程式檢測的變數需要加volatile;

2、多工環境下各任務間共享的標誌應該加volatile;

3、儲存器對映的硬體暫存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義;

另外,以上這幾種情況經常還要同時考慮資料的完整性(相互關聯的幾個標誌讀了一半被打斷了重寫),在1中可以通過關中斷來實現,2中可以禁止任務排程,3中則只能依靠硬體的良好設計了。

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在進行多執行緒程式設計時要注意,而在單執行緒...

C語言 volatile關鍵字

舉例說明 volatile int i 10 int j i int k i volatile 告訴編譯器i是隨時可能發生變化的,每次使用它的時候必須從i的位址中讀取,因而編譯器生成的可執行碼會重新從i的位址讀取資料放在k中。volatile 影響編譯器編譯的結果,指出,volatile 變數是隨時...