一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

C語言中volatile關(guān)鍵字的作用

 carl_xie12 2021-02-01

一.前言
 編譯器優(yōu)化介紹:

  由于內(nèi)存訪問速度遠(yuǎn)不及CPU處理速度,為提高機(jī)器整體性能,

1)在硬件上:  引入硬件高速緩存Cache,加速對內(nèi)存的訪問。另外在現(xiàn)代CPU中指令的執(zhí)行并不一定嚴(yán)格按照順序執(zhí)行,沒有相關(guān)性的指令可以亂序執(zhí)行,以充分利用CPU的指令流水線,提高執(zhí)行速度。

2)軟件一級的優(yōu)化:一種是在編寫代碼時由程序員優(yōu)化,另一種是由編譯器進(jìn)行優(yōu)化。編譯器優(yōu)化常用的方法有:將內(nèi)存變量緩存到寄存器。

由于訪問寄存器要比訪問內(nèi)存單元快的多,編譯器在存取變量時,為提高存取速度,編譯器優(yōu)化有時會先把變量讀取到一個寄存器中;以后再取變量值時就直接從寄存器中取值。但在很多情況下會讀取到臟數(shù)據(jù),嚴(yán)重影響程序的運(yùn)行效果。

----------------------------------------------------------------------------------------------------------------------------------------------------------------

二.volatile詳解

1.原理作用:

  Volatile意思是“易變的”,應(yīng)該解釋為“直接存取原始內(nèi)存地址”比較合適。 

  “易變”是因?yàn)橥庠谝蛩匾鸬?,像多線程,中斷等;

  C語言書籍這樣定義volatile關(guān)鍵字:volatile提醒編譯器它后面所定義的變量隨時都有可能改變,因此編譯后的程序每次需要存儲或讀取這個變量的時候,告訴編譯器對該變量不做優(yōu)化,都會直接從變量內(nèi)存地址中讀取數(shù)據(jù),從而可以提供對特殊地址的穩(wěn)定訪問。。如果沒有volatile關(guān)鍵字,則編譯器可能優(yōu)化讀取和存儲,可能暫時使用寄存器中的值,如果這個變量由別的程序更新了的話,將出現(xiàn)不一致的現(xiàn)象。(簡潔的說就是:volatile關(guān)鍵詞影響編譯器編譯的結(jié)果,用volatile聲明的變量表示該變量隨時可能發(fā)生變化,與該變量有關(guān)的運(yùn)算,不要進(jìn)行編譯優(yōu)化,以免出錯)

2.一般用處:

  一般說來,volatile用在如下的幾個地方: 
  1) 中斷服務(wù)程序中修改的供其它程序檢測的變量,需要加volatile; 

  當(dāng)變量在觸發(fā)某中斷程序中修改,而編譯器判斷主函數(shù)里面沒有修改該變量,因此可能只執(zhí)行一次從內(nèi)存到某寄存器的讀操作,而后每次只會從該寄存器中讀取變量副本,使得中斷程序的操作被短路。
  2) 多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志,應(yīng)該加volatile; 

  在本次線程內(nèi), 當(dāng)讀取一個變量時,編譯器優(yōu)化時有時會先把變量讀取到一個寄存器中;以后,再取變量值時,就直接從寄存器中取值;當(dāng)內(nèi)存變量或寄存器變量在因別的線程等而改變了值,該寄存器的值不會相應(yīng)改變,從而造成應(yīng)用程序讀取的值和實(shí)際的變量值不一致 。
  3) 存儲器映射的硬件寄存器通常也要加volatile說明,因?yàn)槊看螌λ淖x寫都可能由不同意義;

  假設(shè)要對一個設(shè)備進(jìn)行初始化,此設(shè)備的某一個寄存器為0xff800000。for(i=0;i< 10;i++)  *output = i;前面循環(huán)半天都是廢話,對最后的結(jié)果毫無影響,因?yàn)樽罱K只是將output這個指針賦值為9,省略了對該硬件IO端口反復(fù)讀的操作。

3.幾個問題

   1)一個參數(shù)既可以是const還可以是volatile嗎?

  可以的,例如只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?。它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它。

  2) 一個指針可以是volatile 嗎?

  可以,當(dāng)一個中服務(wù)子程序修改一個指向buffer的指針時。

4.下面的函數(shù)有什么錯誤:

int square(volatile int *ptr)
{
    return *ptr * *ptr;
}

該程序的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:

復(fù)制代碼
int square(volatile int *ptr)
{
    int a,b;
    a = *ptr;
    b = *ptr;
    return a * b;
}
復(fù)制代碼

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

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

 

注意:頻繁地使用volatile很可能會增加代碼尺寸和降低性能,因此要合理的使用volatile。

-------------------------------------------------------------------------------------------------------------------------------------
引用:https://blog.csdn.net/tigerjibo/article/details/7427366

     https://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    婷婷亚洲综合五月天麻豆| 日本少妇三级三级三级| 九九热精彩视频在线免费| 深夜福利亚洲高清性感| 亚洲国产精品一区二区| 91精品视频免费播放| 五月天丁香亚洲综合网| 久久女同精品一区二区| 色综合久久六月婷婷中文字幕| 亚洲视频一区自拍偷拍另类| 日韩欧美国产三级在线观看| 91亚洲国产日韩在线| 好骚国产99在线中文| 有坂深雪中文字幕亚洲中文| 亚洲天堂国产精品久久精品| 色一情一伦一区二区三| 一级片黄色一区二区三区| 欧美国产精品区一区二区三区| 国产精品午夜小视频观看| 欧美日韩在线第一页日韩| 日韩精品你懂的在线观看| 国产成人av在线免播放观看av| 欧美午夜不卡在线观看| 亚洲熟妇中文字幕五十路| 91精品国产品国语在线不卡| 一区中文字幕人妻少妇| 大香伊蕉欧美一区二区三区| 欧美日韩一级黄片免费观看| 日韩中文字幕免费在线视频| 国产精品久久精品国产| 精品伊人久久大香线蕉综合| 国产精品亚洲一级av第二区| 美女激情免费在线观看| 国产精品免费视频视频| 五月情婷婷综合激情综合狠狠| 欧美国产极品一区二区| 欧美日韩三区在线观看| 日本亚洲欧美男人的天堂| 夜色福利久久精品福利| 国产欧美日韩精品一区二区| 亚洲男人的天堂久久a|