C語言關鍵字淺析-volatile
阿新 • • 發佈:2018-11-29
### 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