每個變數和他的名字一樣很善變,有時候它善變是發自內心的,有時是外部因素決定的,只有volatile變數才會表裡如一,因此獲得了專一王子的美譽;
作用:volatile字面意思是易揮發,易變化的意思,它修辭的變數表示該變數的值很容易由於外部因素發生改變,強烈請求編譯器要老老實實的在每次對變數進行訪問時去記憶體裡讀取。可能上面說的還不是很清楚,我們換個例子來說,你明天乙個朋友過生日,今天把要送的禮物打包好了,一般情況下,我們明天起來不再需要再開啟驗證一下裡面禮物是否存在,因為我們知道,只要禮物的外包裝沒有動過,裡面東西應該不會被動。其實編譯器和人一樣聰明,為了提高效率也會玩省事,如下面的例子:
1 int a = 10;
2 int b = a;
3 int c = a;
編譯器掃瞄了**發現上面,第一行**在將10賦給了整形變數a,之後a變數的值沒有再發生改變。在後面第二行中,將a變數裡的值取出來賦給b變數。在第三行**裡將a變數的值賦給c的時候,因為cpu訪問記憶體速度較慢(看register關鍵字介紹),編譯器為了提高效率,玩了「省事」,直接將10賦給了c。
單從上述**我們來看是沒有問題的,就如同從外包裝看生日禮物完好一樣。但是,上述**如果執行在多執行緒中,在乙個執行緒上下文中沒有改變它的值,但是我們不能保證變數的值沒有被其它執行緒改變。就好比是,生日禮物放到其它人那裡儲存,我們不敢100%保證它裡面的東西還完好。當然這種資料不一致的機制不僅僅出現在多執行緒中,同樣在裝置的狀態暫存器裡也會存在。比如:網絡卡裡的某狀態暫存器裡的值是否為1表示是否有網路資料到達,在當前時刻其值為1,不能代表著下一時刻其值還為1,它的值是由外界條件決定的,編譯器肯定不能在這種情況下玩「省事」,為了防止在類似的情況下,編譯器玩省事,可以將這些變數宣告為volatile,這樣,不管它的值有沒有變化,每次對其值進行訪問時,都會從記憶體裡,暫存器裡讀取,從而保證資料的一致,做到表裡如一。
C語言關鍵字 專一王子 volatile
c語言深入理解系列 專一王子 volatile 專一王子 volatile 描述 每個變數和他的名字一樣很善變,有時候它善變是發自內心的,有時是外部因素決定的,只有volatile變數才會表裡如一,因此獲得了專一王子的美譽。作用 volatile字面意思是易揮發,易變化的意思,它修辭的變數表示該變數...
C語言關鍵字 專一王子 volatile
專一王子 volatile 描述 每個變數和他的名字一樣很善變,有時候它善變是發自內心的,有時是外部因素決定的,只有volatile變數才會表裡如一,因此獲得了專一王子的美譽。作用 volatile字面意思是易揮發,易變化的意思,它修辭的變數表示該變數的值很容易由於外部因素發生改變,強烈請求編譯器要...
C語言開發之閃電飛刀 register
register就和它的名字一樣,很少出現在 世界中,因為敢稱為閃電飛刀的變數,通常只會在一些特定場合才能出現。它是如此的快,以致於cpu都對其刮目相看,但是它有乙個致命的缺點,它的速度 看心情 而定,不是每一次都能讓人滿意。1 作用 如果乙個變數被register來修辭,就意味著,該變數會作為乙個...