详解volatile关键字
volatile字面意思:易變的。在計(jì)算機(jī)里,是防止優(yōu)化的意思,然而是怎么防止優(yōu)化的呢?待我一一道來哦。
先看這樣一個(gè)例子:
<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>結(jié)果是什么呢?
由于p取得是num的地址,即p指向num,然后*p即取出p指向的內(nèi)容,將它修改為20,所以結(jié)果輸出num也被修改為20.
我們?cè)倏匆粋€(gè)例子:
<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設(shè)定為常量(在c語言中加const修飾變量叫常變量,c++中const修飾變量叫常量),所以無法修改num的值,結(jié)果如下:
這里我詳細(xì)說明一下它是怎么執(zhí)行的?調(diào)出內(nèi)存看一下吧:
這是num所在的位置。賦值為10.
此時(shí)p就指向num。
內(nèi)存里邊p指向的內(nèi)容確實(shí)改變了。但是我們看一下輸出的結(jié)果:(如果在linux下演示的話,將代碼編到test.c下,用命令gcc test.c -02 使優(yōu)化級(jí)別最高進(jìn)行測(cè)試)
為什么輸出的結(jié)果卻是10呢?p所指向的內(nèi)容確實(shí)是num,但是在這里*p改變了,num卻不受影響。。這個(gè)原因就在于const關(guān)鍵字。const將num這個(gè)變量修飾為常量,所以無法修改它,為了使常量不受破壞,就把它放在了寄存器中。以方便使用。又因?yàn)榧拇嫫魇遣痪幹返?#xff0c;所以取地址根本不受影響。說起寄存器,看一下下面這幅圖:(畫的不錯(cuò),網(wǎng)上摳下來的哈)
顯而易見,最上邊的是寄存器,是速度最快的,最下邊是內(nèi)存,是速度最慢的。那么問題來了,既然寄存器這么快,為什么不把變量都放在寄存器里呢。首先,學(xué)過計(jì)算機(jī)組成原理的同學(xué)都知道,寄存器造價(jià)高,空間小,可經(jīng)不起那樣的傷害。所以我們盡可能的把它們放在內(nèi)存中,內(nèi)存的空間大小可比寄存器的大多了。
為了解決上面的問題,我們引來了另一個(gè)關(guān)鍵字: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會(huì)防止編譯器的優(yōu)化,保證內(nèi)存的可見性。也就是不將num放入寄存器,而是放在內(nèi)存中,這樣就可以找到它的地址,進(jìn)而修改它了。
結(jié)果是:
以上就是volatile的簡(jiǎn)單介紹,希望能對(duì)大家的認(rèn)識(shí)有所幫助哦,歡迎來訪~~
總結(jié)
以上是生活随笔為你收集整理的详解volatile关键字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 世界杯哪一年2022在哪举行
- 下一篇: 有趣的链表相关题型