0%
C/C++ volatile
introduction
- 用它宣告的型別變量表示可以被某些編譯器未知的因素更改,比如:作業系統、硬體或者其它執行緒等。
- 遇到這個關鍵字宣告的變數,編譯器對訪問該變數的程式碼就不再進行優化,從而可以提供對特殊地址的穩定訪問。
- 宣告時語法:volatile int vInt;
- 當要求使用 volatile 宣告的變數的值的時候,系統總是重新從它所在的記憶體讀取資料,即使它前面的指令剛剛從該處讀取過資料。而且讀取的資料立刻被儲存。
- e.g.
1 2 3 4
| volatile int i=10; int a = i; ( 其他程式碼,並未明確告訴編譯器,對 i 進行過操作) int b = i;
|
- volatile 指出 i 是隨時可能發生變化的,每次使用它的時候必須從 i的地址中讀取,因而編譯器生成的彙編程式碼會重新從i的地址讀取資料放在 b 中
usage
- 有2兩個場合(I/O & multithread program) 會使用到
e.g.
- I/O, 假設有一程式片斷如下
1 2 3 4 5 6 7 8
| U8 *pPort; U8 i, j, k;
pPort = (U8 *)0x800000;
i = *pPort; j = *pPort; k = *pPort;
|
- 以上的i, j, k很有可能被compiler最佳化而導致產生
i = j = k = *pPort;
的code, 也就是說只從pPort讀取一次, 而產生 i = j = k 的結果
- 但是原本的程式的目的是要從同一個I/O port讀取3次的值給不同的變數, i, j, k的值很可能不同(例如從此 I/O port 讀取溫度), 因此i = j = k 的結果不是我們所要的
- 改為
volatile U8 *pPort;
告訴compiler, pPort變數具有揮發性的特性, 所以與它有關的程式碼請不要作最佳化動作. 因而
Global variables in Multithread program
reference
- C++ volatile用法 - IT閱讀
- C/C++中的volatile使用時機? @ Everything Will Flow :: 痞客邦 ::