C語言關鍵字 volatile

2021-08-27 16:25:08 字數 1020 閱讀 1480

volatile關鍵字

用法:1、告訴編譯器不做任何優化

2、表示用volatile定義的變數會在程式外被改變,每次都必須要從記憶體中讀取,而不能把它放在cache或暫存器中重複使用

volatile是告訴編譯器對它所修飾的物件別執行優化。volatile在進行多執行緒程式設計時要注意,而在單執行緒中那個就是只能起到限制編譯器優化的作用。如果乙個變數被volatile修飾,編譯器將不會把它儲存到暫存器中,而是每一次都去訪問記憶體中實際儲存給變數的位置的值。這樣就避免了沒有volatile修飾的變數在多執行緒的讀寫中所長生的由於編譯器優化所導致的問題。如果沒有volatile關鍵字,則編譯器可能優化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數有別的程式更新了的話,講出現不一致的現象。

volatile int flag=1;

while(flag)

while的編譯條件就不會被編譯器當作無條件真。而是每一次都去記憶體中看一下這個flag的值是不是為真。

volatile變數的例子

1)並行裝置的硬體暫存器(狀態暫存器);

2)乙個中斷服務暫存器中會訪問到的非自動變數

3)多執行緒應用中被幾個任務共享的變數

volatile的幾個問題

1)乙個引數既可以是const還可以是volatile嗎?為什麼?

2)乙個指標可以是volatile嗎?為什麼?

3)下面的函式有什麼錯誤:

int square(volatile int *ptr)

答案:1)是的,乙個例子是唯讀狀態暫存器。它是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去改變它。

2)是的。儘管這病不很常見。乙個例子是打好乙個中斷服務自耦程式修改乙個指向乙個volatile型引數,編譯器講產生類似下面的**:

int square(volatile int *ptr)

由於*ptr的值可能被意想不到地改變,因此a和b可能是不同的。結果,這段到嘛可能不是你所期望的平方值!按正確的**如下

long square(volatile int *ptr)

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