1. 程式人生 > 其它 >【原創】C語言型別限定符-關鍵字

【原創】C語言型別限定符-關鍵字

volatile 限定符告訴計算機,代理(而不是變數所在的程式)可以改變該變數的值。通常,它被用於硬體地址以及在其他程式或同時執行的執行緒中共享資料。一個地址用於接受另一臺計算機傳入的資訊。
volatile涉及編譯器優化。
編譯器注意到程式碼使用了兩次X,但並未改變它的值。於是編譯器把X的值臨時儲存在暫存器中,然後用到時從暫存器中讀取X的值。這個過程叫做快取記憶體。如果沒有volatile關鍵字,編譯器就不知道這種事情是否會發生。因此,編譯器不會進行快取記憶體。如果再程式碼中,宣告沒有volatile關鍵字,編譯器會假定變數的值在使用過程中不變,然後再嘗試優化程式碼。
以上是C primer Plus的解釋
volatile 關鍵字和const 一樣是一種型別修飾符,用它修飾的變量表示可以被某些編譯器未知的因素更改,比如作業系統、硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的程式碼就不再進行優化,從而可以提供對特殊地址的穩定訪問。
先看看下面的例子:

   int i=10;
   int j = i;//(1)語句
   int k = i;//(2)語句

這時候編譯器對程式碼進行優化,因為在(1)、(2)兩條語句中,i 沒有被用作左值。這時候編譯器認為i 的值沒有發生改變,所以在(1)語句時從記憶體中取出i 的值賦給j 之後,這個值並沒有被丟掉,而是在(2)語句時繼續用這個值給k 賦值。編譯器不會生成出彙編程式碼重新從記憶體裡取i 的值,這樣提高了效率。但要注意:(1)、(2)語句之間i 沒有被用作左值才行。
再看另一個例子:

   volatile int i=10;
   int j = i;//(3)語句
   int k = i;//(4)語句

volatile 關鍵字告訴編譯器i 是隨時可能發生變化的,每次使用它的時候必須從記憶體中取出i的值,因而編譯器生成的彙編程式碼會重新從i 的地址處讀取資料放在k 中。
volatile 關鍵字告訴編譯器i 是隨時可能發生變化的,每次使用它的時候必須從記憶體中取出i的值,因而編譯器生成的彙編程式碼會重新從i 的地址處讀取資料放在k 中。

這樣看來,如果i 是一個暫存器變數或者表示一個埠資料或者是多個執行緒的共享資料,就容易出錯,所以說volatile 可以保證對特殊地址的穩定訪問。
至於為什麼容易出錯,先記住怎麼用,以後來填坑。

作者:肆月黃妙之 出處:
https://www.cnblogs.com/hanoch-HMZ/p/15493017.html
本文版權歸作者和部落格園共有,僅作學習用途,歡迎轉載探討,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利.