1. 程式人生 > >C語言關鍵字淺析-volatile

C語言關鍵字淺析-volatile

### C語言關鍵字淺析系列 ###

### ISO/ANSI C 關鍵字 ###

volatile作為一個單詞可能有人都不認識(比如我),查了一下,其英文意思為“易變的;不穩定的;揮發物”

待仔細瞭解了一番volatile關鍵字的用法後,我就領會到了為啥人家歪果仁把這種用法叫做volatile

作為型別限定詞,volatile其實是使用者與編譯器的一種對話,不過用得也挺少的

 

volatile的作用是:

告訴編譯器一個變數除了可以被程式改變,還可以被其他代理改變。

 

同樣作為型別限定詞,你可以把volatile看做restrict的對立面,後者表示變數固定、唯一(詳見相關文章-restrict關鍵字)

volatile表示一個易變的位置,比如用一個地址儲存當前的時間,那麼這個地址中的資料是隨時都在改變的

volatile int a;    /* a是一個易變的位置 */
volatile int *p;   /* p指向一個易變的位置 */

上述說過,volatile是一種與編譯器的對話,何以見得呢?看下面這段code:

var1 = x;  /* 第一次用x */
……         /* 這部分是不用x的程式碼 */
var2 = x;  /* 第二次用x */

優秀的編譯器能發現,你用了兩次x,且x值沒有改變,並且在中間的過程中沒有使用x,這時候它會把x存在一個暫存器中

為的是得到更快的速度,該過程叫做快取(caching)

在ANSI前,上述情況下,沒有volatile編譯器是不敢輕舉妄動去把x存到暫存器,即使用快取的神操作的

而ANSI後,優秀的編譯器即使在沒有volatile的情況下,也敢放開手腳去檢查是否有上述情況,然後嘗試著把x快取

另外,volatile和const可以同時存在,即一個值可以同時是volatile和const的:

const volatile int a;   /* 萍水相逢,順序什麼的,無所謂 */
volatile const int b;

比如硬體時鐘,程式不可改變,呈現const屬性,而其可以被程式外的代理改變,故是volatile的

 

——參考《C Primer Plus第五版》

 

相關文章:

C語言關鍵字淺析-restrict