volatile字面意思:易變的。在計算機里,是防止優化的意思,然而是怎么防止優化的呢?待我一一道來哦。
先看這樣一個例子:
<span style="font-size:18px;">#include<iostream>
using namespace std;
int main()
{int num = 10;int *p = #*p = 20;cout<<num<<endl;getchar();return 0;
}</span>
結果是什么呢?
由于p取得是num的地址,即p指向num,然后*p即取出p指向的內容,將它修改為20,所以結果輸出num也被修改為20.
我們再看一個例子:
<span style="font-size:18px;">#include<iostream>
using namespace std;
int main()
{const int num = 10;int *p = (int*)#*p = 20;cout<<num<<endl;getchar();return 0;
}</span>
這里只是在int前加了const,將num設定為常量(在c語言中加const修飾變量叫常變量,c++中const修飾變量叫常量),所以無法修改num的值,結果如下:
這里我詳細說明一下它是怎么執行的?調出內存看一下吧:
這是num所在的位置。賦值為10.
此時p就指向num。
內存里邊p指向的內容確實改變了。但是我們看一下輸出的結果:(如果在linux下演示的話,將代碼編到test.c下,用命令gcc test.c -02 使優化級別最高進行測試)
為什么輸出的結果卻是10呢?p所指向的內容確實是num,但是在這里*p改變了,num卻不受影響。。這個原因就在于const關鍵字。const將num這個變量修飾為常量,所以無法修改它,為了使常量不受破壞,就把它放在了寄存器中。以方便使用。又因為寄存器是不編址的,所以取地址根本不受影響。說起寄存器,看一下下面這幅圖:(畫的不錯,網上摳下來的哈)
顯而易見,最上邊的是寄存器,是速度最快的,最下邊是內存,是速度最慢的。那么問題來了,既然寄存器這么快,為什么不把變量都放在寄存器里呢。首先,學過計算機組成原理的同學都知道,寄存器造價高,空間小,可經不起那樣的傷害。所以我們盡可能的把它們放在內存中,內存的空間大小可比寄存器的大多了。
為了解決上面的問題,我們引來了另一個關鍵字:volatile。
volatile是這樣使用的。
#include<iostream>
using namespace std;
int main()
{volatile const int num = 10;int *p = (int*)#*p = 20;cout<<num<<endl;getchar();return 0;
}
這樣,volatile會防止編譯器的優化,保證內存的可見性。也就是不將num放入寄存器,而是放在內存中,這樣就可以找到它的地址,進而修改它了。
結果是:
以上就是volatile的簡單介紹,希望能對大家的認識有所幫助哦,歡迎來訪~~