volatile的用法和作用

2021-10-03 21:19:02 字數 1077 閱讀 6664

**

首先volatile修飾的變數,作用在編譯階段,影響編譯出的結果,其修飾的變數是隨時可能被修改的,volatile告訴編譯器,這個變數是重要人物,不要偷懶的去走捷徑,每次認認真真的去從記憶體拿值。

舉個簡單的例子:

求平方:

int square(volatile int *ptr)

假如在你做運算的時候,外部函式將ptr位址指向的值給改變了,那麼你算出來的結果就不是你想要的。

回答兩個問題:

1.乙個變數可以同時被const和volatile修飾嗎?

2.乙個指標可以是volatile的嗎?如果可以那有什麼意義?

第乙個問題的答案是可以的,因為volatile只是告訴編譯器,每次都要去記憶體取直,而不是用快取的資料,然而const修的變數只是說明,該變數在本程式內部是可讀的,但是是可以在程式外部的東西修改,不如外部的狀態暫存器的值等,因此,const保證內部不修改,volatile保證每次都從記憶體取直。

第二個問題,指標可以是volatile的,例如,乙個子服務修改指向乙個buff的指標。

volatile關鍵點:

一、告訴編譯器不做任何優化。

eg:給某乙個位址輸送兩個指令

int *addr = 0***x;

*addr=1;

*addr=2;

以上可能會被優化成:

*addr=…

*addr=2

第一條指令可能會丟失。

而:volatile int *addr = 0***x;

*addr=1;

*addr=2;

編譯器就不會對其做優化:

*addr=1

*addr=2

二、定義的volatile修飾的變數是會在程式外被改變的,所以每次都必須從記憶體中讀取,而不能把他放在cache或暫存器中重複使用。

eg:volatile int flag;

falg = 0;

while(flag==0)

go_on();

如果沒有volatile ,那麼外部對flag的置位程式將不敏感,導致死迴圈。

volatile的作用和舉例

1 作用 作為指令關鍵字,確保本條指令不會因為編譯器的優化而省略,要求每次直接讀值。舉例 int a 10 a 5 a 3 如果不加volatile,編譯器會認為a 3,所以上面兩條指令不會產生機器 2 習題 1 乙個引數既可以是const還可以是volatile嗎?解釋為什麼。2 乙個指標可以是v...

volatile的用法 一

乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子 1 並行裝置的硬體暫存器 如 狀態暫存器 2 乙個...

C 中volatile的作用

volatile的語法和const的是一樣的,但是volatile的意思是 在編譯器認識的範圍外,這個資料可以改變 環境正在改變資料 可能通過多工 多執行緒或者中斷處理 所以,volatile告訴編譯器不要擅自做出有關該資料的任何假定,優化期間尤其如此。volatile的本意是一般有兩種說法 1.暫...