C語言 volatile關鍵字的作用

2021-10-08 10:50:42 字數 1356 閱讀 6286

volatile意思是「易變的」,應該解釋為「直接訪問原始記憶體位址」比較合適。

作用:

volatile的作業的是告訴編譯器不要對該變數進行優化,這個變數可能會有意向不想的改變,然後都會直接從變數記憶體位址中讀取資料,從而可以提供對特殊位址的穩定訪問。如果沒有volatile宣告,則編譯器可能優化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數由別的程式更新了的話,將出現不一致的現象。

編譯器優化介紹:

由於記憶體訪問速度遠不及cpu處理速度,為提高機器整體效能,

1)在硬體上: 引入硬體快取記憶體cache,加速對記憶體的訪問。另外在現代cpu中指令的執行並不一定嚴格按照順序執行,沒有相關性的指令可以亂序執行,以充分利用cpu的指令流水線,提高執行速度。

2)軟體一級的優化:一種是在編寫**時由程式設計師優化,另一種是由編譯器進行優化。編譯器優化常用的方法有:將記憶體變數快取到暫存器。

由於訪問暫存器要比訪問記憶體單元快的多,編譯器在訪問變數時,為提高訪問速度,編譯器優化有時會先把變數讀取到乙個暫存器中;以後再取變數值時就直接從暫存器中取值。但在很多情況下會讀取到髒資料,嚴重影響程式的執行效果。

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

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

當變數在觸發某中斷程式中修改,而編譯器判斷主函式裡面沒有修改該變數,因此可能只執行一次從記憶體到某暫存器的讀操作,而後每次只會從該暫存器中讀取變數副本,使得中斷程式的操作被短路。

2) 多執行緒環境下各任務間共享的標誌,應該加volatile;

在本次執行緒內, 當讀取乙個變數時,編譯器優化時有時會先把變數讀取到乙個暫存器中;以後,再取變數值時,就直接從暫存器中取值;當記憶體變數或暫存器變數在因別的執行緒等而改變了值,該暫存器的值不會相應改變,從而造成應用程式讀取的值和實際的變數值不一致 。

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

例如:假設要對乙個裝置進行初始化,此裝置的某乙個暫存器為0xff800000。

int

*output =

(unsigned

int*

)0xff800000

;//定義乙個io埠;

intinit

(void

)}

經過編譯器優化後,編譯器認為前面迴圈半天都是廢話,對最後的結果毫無影響,因為最終只是將output這個指標賦值為9,所以編譯器最後給你編譯編譯的**結果相當於:

int

init

(void

)

C語言volatile關鍵字

volatile 是易變的 不穩定的意思。很多人根本就沒見過這個關鍵字,不知道它的存在。也有很多程式設計師知道它的存在,但從來沒用過它。我對它有種 楊家有女初長成,養在深閨人未識 的感覺。volatile 關鍵字和const 一樣是一種型別修飾符,用它修飾的變數表示可以被某些編譯器未知的因素更改,比...

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