亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

討論C語言中關(guān)鍵字volatile的含義

2020-02-24 14:32:41
字體:
供稿:網(wǎng)友

關(guān)鍵字volatile有什么含意?在本文中,我們將討論C語言中關(guān)鍵字volatile的含義,正好需要這方面知識點(diǎn)的同學(xué)趕緊看過來吧,趕緊跟武林技術(shù)頻道的編輯一起學(xué)習(xí)起來吧。

volatile 的意思是“易失的,易改變的”。這個(gè)限定詞的含義是向編譯器指明變量的內(nèi)容可能會由于其他程序的修改而變化。通常在程序中申明了一個(gè)變量時(shí),編譯器會盡量把它存放在通用寄存器中,例如ebx。當(dāng)CPU把其值放到ebx中后就不會再關(guān)心對應(yīng)內(nèi)存中的值。若此時(shí)其他程序(例如內(nèi)核程序或一個(gè)中斷)修改了內(nèi)存中它的值,ebx中的值并不會隨之更新。為了解決這種情況就創(chuàng)建了volatile限定詞,讓代碼在引用該變量時(shí)一定要從指定位置取得其值。

關(guān)鍵字volatile有什么含意?并給出三個(gè)不同的例子。 一個(gè)定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個(gè)變量的值了。精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子:
1). 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)
2). 一個(gè)中斷服務(wù)子程序中會訪問到的非自動(dòng)變量(Non-automatic variables)
3). 多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量

回答不出這個(gè)問題的人是不會被雇傭的。我認(rèn)為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內(nèi)容將會帶來災(zāi)難。
假設(shè)被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,看一下這家伙是不是直正懂得volatile完全的重要性。
1). 一個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么。
2). 一個(gè)指針可以是volatile 嗎?解釋為什么。
3). 下面的函數(shù)有什么錯(cuò)誤:

int square(volatile int *ptr)
{return *ptr * *ptr;}
下面是答案:
1). 是的。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?。它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它。
2). 是的。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)。
3). 這段代碼的有個(gè)惡作劇。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個(gè)volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:

?

int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}


由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:

?

?

?


long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a; }
?


volatile的本意是“易變的”??
由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優(yōu)化。比如:

?

?

?


static?? int?? i=0;
int?? main(void)
{
??????? ...
??????? while?? (1)
??????? {
??????????????? if?? (i)?? dosomething();
??????? }
}
/*?? Interrupt?? service?? routine.?? */
void?? ISR_2(void)
{
????????? i=1;
}


程序的本意是希望ISR_2中斷產(chǎn)生時(shí),在main當(dāng)中調(diào)用dosomething函數(shù),但是,由于編譯器判斷在main函數(shù)里面沒有修改過i,因此
可能只執(zhí)行一次對從i到某寄存器的讀操作,然后每次if判斷都只使用這個(gè)寄存器里面的“i副本”,導(dǎo)致dosomething永遠(yuǎn)也不會被調(diào)用。如果將將變量加上volatile修飾,則編譯器保證對此變量的讀寫操作都不會被優(yōu)化(肯定執(zhí)行)。此例中i也應(yīng)該如此說明。
一般說來,volatile用在如下的幾個(gè)地方:
1、中斷服務(wù)程序中修改的供其它程序檢測的變量需要加volatile;
2、多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志應(yīng)該加volatile;
3、存儲器映射的硬件寄存器通常也要加volatile說明,因?yàn)槊看螌λ淖x寫都可能由不同意義;

另外,以上這幾種情況經(jīng)常還要同時(shí)考慮數(shù)據(jù)的完整性(相互關(guān)聯(lián)的幾個(gè)標(biāo)志讀了一半被打斷了重寫),在1中可以通過關(guān)中斷來實(shí)
現(xiàn),2中可以禁止任務(wù)調(diào)度,3中則只能依靠硬件的良好設(shè)計(jì)了。
//=============
指針類型也是一種變量,所以也是可以用volatile來修飾的.
volatile關(guān)鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改,比如
操作系統(tǒng)、硬件或者其它線程等。遇到這個(gè)關(guān)鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進(jìn)行
優(yōu)化,從而可以提供對特殊地址的穩(wěn)定訪問。
使用該關(guān)鍵字的例子如下:
int?? volatile?? nVint;
當(dāng)要求使用volatile?? 聲明的變量的值的時(shí)候,系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指
令剛剛從該處讀取過數(shù)據(jù)。而且讀取的數(shù)據(jù)立刻被保存。
例如:
volatile?? int?? i=10;
int?? a?? =?? i;
。。。//其他代碼,并未明確告訴編譯器,對i進(jìn)行過操作
int?? b?? =?? i;
volatile?? 指出?? i是隨時(shí)可能發(fā)生變化的,每次使用它的時(shí)候必須從i的地址中讀取,因而編譯器生成的
匯編代碼會重新從i的地址讀取數(shù)據(jù)放在b中。而優(yōu)化做法是,由于編譯器發(fā)現(xiàn)兩次從i讀數(shù)據(jù)的代碼之間
的代碼沒有對i進(jìn)行過操作,它會自動(dòng)把上次讀的數(shù)據(jù)放在b中。而不是重新從i里面讀。這樣以來,如果
i是一個(gè)寄存器變量或者表示一個(gè)端口數(shù)據(jù)就容易出錯(cuò),所以說volatile可以保證對特殊地址的穩(wěn)定訪問。
注意,在vc6中,一般調(diào)試模式?jīng)]有進(jìn)行代碼優(yōu)化,所以這個(gè)關(guān)鍵字的作用看不出來。下面通過插入?yún)R編
代碼,測試有無volatile關(guān)鍵字,對程序最終代碼的影響:
首先用classwizard建一個(gè)win32?? console工程,插入一個(gè)voltest.cpp文件,輸入下面的代碼:

?

?

?


#include?? <stdio.h>
void?? main()
{
? int?? i=10;
? int?? a?? =?? i;
? printf( "i=?? %d/n ",a);
??????????????? //下面匯編語句的作用就是改變內(nèi)存中i的值,但是又不讓編譯器知道
? __asm?? {
??? mov?????????????????? dword?? ptr?? [ebp-4],?? 20h
? }
? int?? b?? =?? i;
? printf( "i=?? %d/n ",b);
}


然后,在調(diào)試版本模式運(yùn)行程序,輸出結(jié)果如下:

?

?

?


i?? =?? 10
i?? =?? 32


然后,在release版本模式運(yùn)行程序,輸出結(jié)果如下:

?

?

?


i?? =?? 10
i?? =?? 10


輸出的結(jié)果明顯表明,release模式下,編譯器對代碼進(jìn)行了優(yōu)化,第二次沒有輸出正確的i值。
下面,我們把?? i的聲明加上volatile關(guān)鍵字,看看有什么變化:

?

?

?


#include?? <stdio.h>
void?? main()
{
? volatile?? int?? i=10;
? int?? a?? =?? i;
? printf( "i=?? %d/n ",a);
? __asm?? {
??? mov?????????????????? dword?? ptr?? [ebp-4],?? 20h
? }
? int?? b?? =?? i;
? printf( "i=?? %d/n ",b);
}


分別在調(diào)試版本和release版本運(yùn)行程序,輸出都是:

?

?

?


i?? =?? 10
i?? =?? 32

這說明這個(gè)關(guān)鍵字發(fā)揮了它的作用!
討論C語言中關(guān)鍵字volatile的含義就講完了,如果有什么不清楚可以留言給我,如果覺得我寫還可以的話,請給武林技術(shù)頻道一個(gè)關(guān)注,謝謝!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

baoyu777.永久免费视频| 性久久久久久久久久久久久久| 色www永久免费视频首页在线| 亚洲色图35p| 欧美xxxx×黑人性爽| 精品国产网站在线观看| 成人黄色av网站在线| 日韩欧美在线视频日韩欧美在线视频| av在线免费播放网站| 精品久久久久久久久久久| 久久婷婷国产综合国色天香| 亚洲人成电影在线观看天堂色| 欧美a在线播放| 久久久一本精品99久久精品| 国产一区视频导航| a在线欧美一区| 国产日韩中文字幕在线| 国产亚洲午夜| 真人做人试看60分钟免费| 色在线视频免费| 中文字幕国产免费| 国产成人自拍一区| 波多视频一区| 国产精品入口日韩视频大尺度| 日韩av手机在线看| 美女毛片一区二区三区四区最新中文字幕亚洲| 欧美一级一级性生活免费录像| 亚洲av成人无码久久精品| 亚洲一区二区免费看| 男人添女荫道口喷水视频| 国产成人无码一区二区三区在线| 老司机精品视频网站| 日韩久久中文字幕| 欧美日韩经典丝袜| 欧美影院一区二区| 国产精品久久久久久久app| av大片免费在线观看| 逼特逼视频在线观看| 中文字幕欧美人妻精品一区蜜臀| 乱亲女秽乱长久久久| 精品一区二区在线播放| 中文字幕乱码人妻二区三区| 一道本在线免费视频| 美日韩免费视频| 国产精品第一视频| 亚洲大片精品免费| 黄色高清无遮挡| 国产成人免费在线观看| 国产二级一片内射视频播放| 亚洲free嫩bbb| 美女黄视频在线观看| 成年女人免费毛片视频永久| 91麻豆成人精品国产免费网站| 国产精品入口麻豆电影| 日本免费不卡一区二区| 18岁视频在线观看| 成人免费视频网站入口::| 91香蕉视频污| 亚洲国产精品国自产拍av| 亚洲天堂一区在线观看| 亚洲一二三区在线观看| 久久久噜噜噜久久狠狠50岁| av有声小说一区二区三区| 亚洲第一福利视频在线| 日本高清不卡一区二区三| 天堂网av手机版| 国产精品女人久久久久久| 国内久久久精品| 久久九九热免费视频| 中文字幕久久久久| 欧性猛交ⅹxxx乱大交| 在线观看国产v片| 精品调教chinesegay| 国精产品乱码一区一区三区四区| 国产性生活网站| 77777_亚洲午夜久久多人| 米奇在线777| 亚洲夫妻av| 欧美成人激情视频| 色综合一个色综合| 国产精品美女www爽爽爽| 久久这里只有精品9| 免费观看性欧美大片无片| 国产一区二区三区丝袜| 成人性生交大片免费观看嘿嘿视频| 免费成人美女在线观看| 人妻丰满熟妇av无码久久洗澡| 成年网站在线播放| 久久黄色免费视频| 伊人在线视频| 日日碰狠狠丁香久燥| 中文字幕成人一区| 亚洲精品日韩久久| www99avcom| 亚洲欧美在线第一页| 天堂视频免费看| 亚洲精品天堂在线观看| 国产国产国产国产国产国产| 久久久久北条麻妃免费看| 樱桃视频在线观看一区| 日韩av电影中文字幕| 成人免费视频网站在线看| 色偷偷噜噜噜亚洲男人| 黄色av中文字幕| 国产成人精品一区二三区在线观看| 国产免费福利网站| 一区二区三区四区影院| 中国女人久久久| 男女小视频在线观看| 日本私人网站在线观看| 欧美成人xxxx| 国产中文字幕av| 亚洲午夜精品一区二区国产| 亚洲va欧美va国产综合久久| 91精品国产乱码久久久久久蜜臀| 日本免费一区二区三区四区| 久久99精品久久久久子伦| 亚洲高清在线免费| 亚洲女同性videos| 日韩av福利| 天堂在线中文字幕| 天天干夜夜夜操| 殴美一级黄色片| 国内外成人免费激情在线视频网站| 91深夜福利| 91视频福利| 欧美午夜激情视频| 欧美三级午夜理伦三级中视频| 久热这里只有精品在线| 美女一区视频| 精品久久久一区二区| 午夜影院免费观看视频| 一个人在线观看免费视频www| 99re热久久这里只有精品34| 亚洲特级片在线| 亚洲综合激情另类小说区| 久久综合亚州| www.日韩在线观看| 欧美日韩你懂的| 一个人看的日本免费视频| 中文字幕 欧美 日韩| 一区二区三区美女xx视频| 亚洲美女在线播放| 亚洲免费观看在线观看| 91porn在线观看| 亚洲日产av中文字幕| 精品日韩美女| 四季av中文字幕| 性欧美疯狂xxxxbbbb| 国产精品678| h片在线观看视频免费免费| 人人做人人爽| 伊人久久大香线蕉午夜av| 亚洲高清在线精品| 一级片免费在线观看视频| 国产高中女学生第一次| 黑人巨大精品欧美一区二区三区| 国产精品久久久久久久精| 宅男深夜免费观看视频| 北条麻妃视频在线| gogo大胆日本视频一区| 91另类视频| 日本成人在线视频网站| 精品欧美日韩| 国产精品三级在线观看无码| 国产成人亚洲综合91精品| 日韩欧美第一页| 日本少妇久久久| 99精品桃花视频在线观看| 日本免费看片网站| 天天爽天天狠久久久| 熟女少妇一区二区三区| 国产乱了高清露脸对白| 欧美理论影院| 99re国产精品| 国产三级精品三级观看| 午夜伦理大片视频在线观看| 中文字幕一区二区三区精品| 99精品视频播放| 国产九色在线| 四虎永久免费地址| 中文字幕一区不卡| 亚洲 欧美 综合 另类 中字| 91欧美一区二区| 亚洲激情视频在线观看| 国产一区二区视频网站| 一个人免费观看在线视频www| 亚洲裸体视频| 成年女人毛片| 亚洲精品大片| 亚洲天堂av片| 日韩一区二区在线观看| 中文字幕亚洲精品乱码| 国产欧美精品va在线观看| 人妻 日韩 欧美 综合 制服| 黄色视屏在线免费观看| 68精品国产免费久久久久久婷婷| 日本国产在线观看| 色哟哟一区二区三区| 亚洲中文字幕无码一区| 在线观看国产麻豆| 欧美成人a∨高清免费观看| 人人妻人人澡人人爽欧美一区双| 欧美三级网站在线观看| 夜夜嗨aⅴ一区二区三区| 久久国产毛片| www婷婷av久久久影片| 开心九九激情九九欧美日韩精美视频电影| 91系列在线播放| 毛片无码国产| 亚洲一区二区免费视频软件合集| 国产suv精品一区二区三区| 亚洲欧美一区二区三区| 国产欧美二区| 亚洲国产图片| 国产免费无码一区二区视频| 欧美亚洲精品一区二区| 国内精品久久久久久久久蜜桃| 日本欧美国产在线| 亚洲精蜜桃久在线| 亚洲电影欧美电影有声小说| 国产人妻黑人一区二区三区| 精产国品自在线www| 不卡一本毛片| 最近免费中文字幕大全免费第三页| 免费在线观看污网站| 欧美黄色激情视频| 高清亚洲高清| 成人在线丰满少妇av| 免费萌白酱国产一区二区三区| 五月天亚洲综合小说网| 麻豆高清免费国产一区| 国产日韩欧美视频| 亚洲国产精品午夜在线观看| 久久99久久99精品蜜柚传媒| 在线免费中文字幕| va婷婷在线免费观看| 国产欧美一区二区三区在线| 五月天亚洲婷婷| 日日干夜夜骑| 成人av三级| 久久网中文字幕| 小泽玛利亚av在线| 一代武则天秘史| www污网站在线观看| 国产欧美日韩中文字幕在线| 日韩美女免费观看| 欧美精品se| 先锋影音中文字幕| 亚洲视频成人| 色综合久久久久网| 国产欧美二区| 二区视频在线观看| 青青草原在线免费观看视频| 顶级嫩模精品视频在线看| 国产美女精品人人做人人爽| youjizz.com在线观看| 欧美男男gaytwinkfreevideos| 亚洲免费一级视频| 最新精品视频在线| 久久久五月婷婷| 国产色婷婷国产综合在线理论片a| avtt天堂资源网站| 美女日批在线观看| 男女性高潮免费网站| 国产欧美丝袜| 亚洲深夜视频| 日韩三级视频在线| 免费亚洲电影| 成人午夜在线视频| 国产欧美日韩综合精品一区二区| 91精品国产99久久久久久红楼| 超碰影院在线观看| 97热精品视频官网| 国产91成人在在线播放| 国产日产高清欧美一区二区三区| 91精品国产综合久久久久久| 五月天激情图片| 美女被人操网站| 在线观看免费成人| 亚洲小说欧美激情另类| 黄色精品一区二区| 九九热视频免费在线观看| 国产精品乱码一区二区| 69国产精品成人在线播放| 中文字幕精品在线播放| 久久国产激情视频| 亚洲激情自拍偷拍| 国产女人18毛片水18精品| 久久久人人爽| 一本到不卡精品视频在线观看| 自拍亚洲一区欧美另类| 五月精品视频| 熟女人妻一区二区三区免费看| 欧美日本一区二区视频在线观看| 精品国产乱码久久久久久夜甘婷婷| 黄色精品网站| 麻豆乱码国产一区二区三区| 国产精品无码AV| 国产精品极品在线观看| 波多野结衣影片| 黄色在线观看网站| 丰满少妇被猛烈进入| 一级特黄aaa| 678五月天丁香亚洲综合网| 欧美日韩**字幕一区| 国产精品亚洲视频| 国产又爽又黄又舒服又刺激视频| 成年人小视频网站| 亚洲国产精品一区二区尤物区| 视频在线这里都是精品| 希岛爱理中文字幕| av成人免费在线| 欧美oldwomenvideos| 亚洲欧美高清在线| 91啪九色porn原创视频在线观看| 2019中文字幕在线视频| 亚洲电影免费观看| 综合色就爱涩涩涩综合婷婷| 爽爽爽爽爽爽爽成人免费观看| 中文字幕乱伦视频| 欧美黄色网络| 精品一区二区三区免费| 天天色图综合网| 在线观看av一区| 国产精品久久久久久av公交车| 中文字幕亚洲情99在线| 午夜精品视频在线观看|