99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言深入理解系列之專(zhuān)一王子:volatile

Q4MP_gh_c472c21 ? 來(lái)源:未知 ? 作者:胡薇 ? 2018-06-11 11:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

每個(gè)變量和其名字一樣善變,有時(shí)候它善變是發(fā)自?xún)?nèi)心的,有時(shí)候是外部因素決定的,只有volatile變量才會(huì)表里如一,因此獲得了專(zhuān)一王子的美譽(yù)。

volatile字面意思是易揮發(fā)、易變化的意思,它修飾的變量表示該變量的值很容易由于外部的因素而發(fā)生改變,強(qiáng)烈要求編譯器要老老實(shí)實(shí)的在每次對(duì)變量進(jìn)行訪(fǎng)問(wèn)時(shí)去內(nèi)存里讀取。

舉個(gè)生活中的栗子:

你明天 有一個(gè)朋友要過(guò)生日,今天把要送的禮物打包好了,一般情況下,我們明天起來(lái)不需要再次打開(kāi)驗(yàn)證一下里面的禮物是否存在,因?yàn)槲覀冎?,只要禮物的外包裝沒(méi)有動(dòng)過(guò),里面的東西應(yīng)該也沒(méi)有動(dòng)過(guò)。其實(shí)編譯器和人一樣聰明,為了提高效率也會(huì)玩省事,做優(yōu)化。

如下面的例子:

編譯器掃描了代碼發(fā)現(xiàn)上面,第一行代碼將10賦給了整型變量a,之后a變量的值沒(méi)有再發(fā)生變化,在后面的第二行中,將a變量的值取出來(lái)賦給b,在第三行代碼里面將a變量的值賦給了c的時(shí)候,因?yàn)?a href="http://www.socialnewsupdate.com/v/tag/132/" target="_blank">CPU訪(fǎng)問(wèn)內(nèi)存速度慢,編譯器為了提高效率,玩“省事”,直接將10賦給了c。

單從上面的代碼我們來(lái)看是沒(méi)有問(wèn)題的,就如同從外包裝看生日禮物完好一樣。但是,如果上述代碼運(yùn)行在多線(xiàn)程中,在一個(gè)線(xiàn)程上下文中沒(méi)有改變它的值,但是我們卻不能保證變量的值沒(méi)有被其他線(xiàn)程所改變,就好比是,生日禮物放在其他人那里保管,我們不敢100%的確定它里面的東西完好。當(dāng)然這種數(shù)據(jù)不一致的機(jī)制不僅僅出現(xiàn)在多線(xiàn)程中,同樣在設(shè)備的狀態(tài)寄存器里也會(huì)存在。例如,網(wǎng)卡里的某狀態(tài)寄存器里的值是否為1表示是否有網(wǎng)絡(luò)數(shù)據(jù)到達(dá),在當(dāng)前時(shí)刻其值為1,不能代表下一時(shí)刻它的值還是1,它的值有外界決定,編譯器肯定不能在這種情況下玩“省事”,為了防止在類(lèi)似的情況下編譯器玩省事,可以將這些變量聲明為volatile,這樣不管它的值有沒(méi)有變化,每次對(duì)其值進(jìn)行訪(fǎng)問(wèn)的時(shí)候,都會(huì)從內(nèi)存里,寄存器了讀取,保證數(shù)據(jù)的一致、做到表里如一。

總結(jié):

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

(1). 一個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么。答:是的。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?。它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它。(2). 一個(gè)指針可以是volatile 嗎?解釋為什么。答:是的。盡管這并不很常見(jiàn)。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)。(3). 下面的函數(shù)有什么錯(cuò)誤:

這段代碼的有個(gè)惡作劇。這段代碼的目的是用來(lái)返指針*ptr指向值的平方,但是,由于*ptr指向一個(gè)volatile型參數(shù),編譯器將產(chǎn)生類(lèi)似下面的代碼:

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141675
  • volatile
    +關(guān)注

    關(guān)注

    0

    文章

    46

    瀏覽量

    13347

原文標(biāo)題:專(zhuān)一的王子,C語(yǔ)言volatile關(guān)鍵字解析

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    深入理解Android

    深入理解Android
    發(fā)表于 08-20 15:30

    深入理解和實(shí)現(xiàn)RTOS_連載

    和trcohili的帖子。trochili rtos完全是作者興趣所在,且行且堅(jiān)持,比沒(méi)有duo。深入理解和實(shí)現(xiàn)RTOS_連載1_RTOS的前生今世今天發(fā)布的是第篇,"RTOS的前生今世"
    發(fā)表于 05-30 01:02

    深入理解C語(yǔ)言比較有用的幾個(gè)資料

    這里有三個(gè)對(duì)深入理解C語(yǔ)言的資料,覺(jué)得不錯(cuò),分享
    發(fā)表于 08-07 21:37

    51單片機(jī)C語(yǔ)言講義(譚浩強(qiáng))以及深入理解C指針

    本帖最后由 發(fā)燒友麒麟 于 2014-10-6 09:19 編輯 C語(yǔ)言講義(譚浩強(qiáng))及深入理解C指針,自己在用的資料,覺(jué)得寫(xiě)得挺好
    發(fā)表于 10-02 17:05

    專(zhuān)一王子,C語(yǔ)言volatile關(guān)鍵字解析

    每個(gè)變量和其名字樣善變,有時(shí)候它善變是發(fā)自?xún)?nèi)心的,有時(shí)候是外部因素決定的,只有volatile變量才會(huì)表里如,因此獲得了專(zhuān)一王子的美譽(yù)。
    發(fā)表于 06-11 08:26

    如何深入理解ES6函數(shù)

    深入理解ES6函數(shù)
    發(fā)表于 05-22 07:40

    深入理解STM32

    時(shí)鐘系統(tǒng)是處理器的核心,所以在學(xué)習(xí)STM32所有外設(shè)之前,認(rèn)真學(xué)習(xí)時(shí)鐘系統(tǒng)是必要的,有助于深入理解STM32。下面是從網(wǎng)上找的個(gè)STM32時(shí)鐘框圖,比《STM32中文參考手冊(cè)》里面的是中途看起來(lái)清晰些:重要的時(shí)鐘:PLLCL
    發(fā)表于 08-12 07:46

    對(duì)棧的深入理解

    為什么要深入理解棧?做C語(yǔ)言開(kāi)發(fā)如果棧設(shè)置不合理或者使用不對(duì),棧就會(huì)溢出,溢出就會(huì)遇到無(wú)法預(yù)測(cè)亂飛現(xiàn)象。所以對(duì)棧的深入理解是非常重要的。注:動(dòng)畫(huà)如果看不清楚可以電腦看更清晰啥是棧先來(lái)看
    發(fā)表于 02-15 07:01

    為什么要深入理解

    [導(dǎo)讀] 從這篇文章開(kāi)始,將會(huì)不定期更新關(guān)于嵌入式C語(yǔ)言編程相關(guān)的個(gè)人認(rèn)為比較重要的知識(shí)點(diǎn),或者踩過(guò)的坑。為什么要深入理解棧?做C語(yǔ)言開(kāi)發(fā)如
    發(fā)表于 02-15 06:09

    深入理解Android資源文件

    深入理解Android資源文件
    發(fā)表于 01-22 21:11 ?22次下載

    深入理解Android》文前

    深入理解Android》文前
    發(fā)表于 03-19 11:23 ?0次下載

    深入理解Android:卷I》

    深入理解Android:卷I》
    發(fā)表于 03-19 11:23 ?0次下載

    深入理解C指針(C/C++程序員進(jìn)階必備,透徹理解指針與內(nèi)存管理)pdf

    深入理解C指針
    發(fā)表于 03-21 09:42 ?120次下載

    STM32編程:是時(shí)候深入理解棧了<>

    為什么要深入理解棧?做C語(yǔ)言開(kāi)發(fā)如果棧設(shè)置不合理或者使用不對(duì),棧就會(huì)溢出,溢出就會(huì)遇到無(wú)法預(yù)測(cè)亂飛現(xiàn)象。所以對(duì)棧的深入理解是非常...
    發(fā)表于 01-26 17:55 ?2次下載
    STM32編程:是時(shí)候<b class='flag-5'>深入理解</b>棧了<<b class='flag-5'>一</b>>

    深入理解C語(yǔ)言:循環(huán)語(yǔ)句的應(yīng)用與優(yōu)化技巧

    能讓你的代碼更加簡(jiǎn)潔明了,還能顯著提升程序執(zhí)行效率。本文將詳細(xì)介紹C語(yǔ)言中的三種常見(jiàn)循環(huán)結(jié)構(gòu)——while循環(huán)、for循環(huán)和do...while循環(huán),帶你深入理解
    的頭像 發(fā)表于 12-07 01:11 ?633次閱讀
    <b class='flag-5'>深入理解</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:循環(huán)語(yǔ)句的應(yīng)用與優(yōu)化技巧