C語言中volatile關鍵字的深入講解

2022-09-24 20:06:07 字數 954 閱讀 5263

volatile用於宣告乙個變數,告訴編譯器該變數值容易發生改變,在編譯、讀取、儲存該變數的時候都不要做任何優化,程式設計客棧因此編譯後的程式每次需要儲存或讀取這個變數的時候,都會直接從變數位址中讀取儲存資料,不做優化,在我們做嵌入式開發的時候,該關鍵字作用很大,因為有時變數位址有可能是系統的乙個外設位址,他的值的變化並不在程式控制範圍內,隨時有可能變化,因此需要對他進行宣告,每次讀取或者儲存直接對位址進行操作,而不經過其他中間商,下面我以乙個例子來分析vilatile的作用:

在看例子前先了解一下gcc的優化概念,通常c語言的編譯器使用的是gcc編譯器,他有個以下幾個等級的優化

開啟不同的優化等級,程式編譯後的結果就會發生一定的變化,而volatile就是在開啟優化的情況下使用,保護變數不被優化

我們先寫一段c程式

#include

int main(void)

程式建立乙個變數i,對i進行三次賦值,使用-o預設優化等級對**進行編譯,檢視彙編fspoefivgp結果,我們可以看到優化後,i=1和i=2被優化,沒有生成之間彙編**,直接取最後的值定址賦值給i

當我們使用volatile宣告變數後

#include

int main(void)

編譯如下,可以看到變數i的每乙個賦值都生成了彙編**,沒有被優化,每次賦值都重新定址賦值

當我們使用volatile對乙個對映到外部暫存器的位址進行宣告後,如果像上面連續賦值來傳資料給外部暫存器,使用volatile宣告就可以保護指令不會被優化,程式實現正常功能,當然除了用於對暫存器的保護外,volatile有時也使用在多執行緒間共享變數的保護,如果不注意,編譯器會認為變數只在當前函式使用而進行優化,在其他任務中進行的改變就變的無效;如果中斷中改變乙個狀態變數給其他函式進行檢測,如果沒有加volatile進行宣告,也可以會因為編譯器的優化而無效,所以大家在以上三種情況下使用變數時可以結合程式設計客棧編譯器的優化等級考慮一下,是不是需要將變數宣告一下volatile關鍵字!!!

c語言中volatile關鍵字

volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改 比如 作業系統 硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的 就不再進行優化,從而可以提供對特殊位址的穩定訪問。使用該關鍵字的例子如下 int volatile nvint 當要求使...

C語言中volatile關鍵字

一 前言 程式的優化 1 硬體級別上的優化 a.由於記憶體訪問速度遠不及cpu處理速度,為提高機器整體效能,在硬體上引入硬體快取記憶體cache,加速對記憶體的訪問。b.在現代cpu中指令的執行並不一定嚴格按照順序執行,沒有相關性的指令可以亂序執行,以充分利用cpu的指令流水線,提高執行速度。2 軟...

C語言中volatile關鍵字

1.編譯器優化介紹 由於記憶體訪問速度遠不及cpu處理速度,為提高機器整體效能,在硬體上引入硬體快取記憶體cache,加速對記憶體的訪問。另外在現代cpu中指令的執行並不一定嚴格按照順序執行,沒有相關性的指令可以亂序執行,以充分利用cpu的指令流水線,提高執行速度。以上是硬體級別的優化。再看軟體一級...