最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章帶你了解C語言中volatile關(guān)鍵字

 更新時(shí)間:2021年09月01日 16:51:17   作者:精致的灰(>_<)  
這篇文章主要給大家介紹了關(guān)于C語言中volatile關(guān)鍵字,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

volatile關(guān)鍵字是C語言中非常冷門的關(guān)鍵字,因?yàn)橛玫竭@個(gè)關(guān)鍵字的場(chǎng)景并不多。

當(dāng)不用這個(gè)關(guān)鍵字的時(shí)候,CPU可能會(huì)對(duì)我們的代碼做一定的優(yōu)化:

內(nèi)存中的數(shù)據(jù)要放入CPU中進(jìn)行運(yùn)算或控制,而這個(gè)數(shù)據(jù)的值是被放入寄存器中,然后再將寄存器中的數(shù)據(jù)進(jìn)行運(yùn)算或控制的,對(duì)于一個(gè)死循環(huán)int flag=1;while(flag);來說;如果進(jìn)行優(yōu)化,則下次循環(huán)則不需要再次將flag內(nèi)存中的值放入寄存器中,而是直接使用寄存器中已有的值進(jìn)行循環(huán);如果不進(jìn)行優(yōu)化,則下次還需要將flag內(nèi)存中的值放入寄存器中,然后使用寄存器中的數(shù)據(jù)。

總結(jié)起來就是,遇到這個(gè)關(guān)鍵字聲明的變量,編譯器對(duì)訪問該變量的代碼就不再進(jìn)行優(yōu)化,從而可以提供對(duì)其地址的穩(wěn)定訪問;如果不使用valatile,則編譯器將對(duì)所聲明的語句進(jìn)行優(yōu)化。

這兩種情況在單線程的情況下區(qū)別不大,但是在多線程的情況下可能會(huì)有其他邏輯將flag修改為0,如果進(jìn)行優(yōu)化,則死循環(huán)不會(huì)停下來。

所以volatile的作用就是讓變量不要被CPU優(yōu)化,達(dá)到穩(wěn)定訪問內(nèi)存的目的。

比如下面的代碼:

在這里插入圖片描述

我們?cè)趃cc下使用命令gcc test.c -O2 -g將代碼進(jìn)行優(yōu)化,然后用命令objdump -S -d a.out > a.s將優(yōu)化后的匯編代碼放入a.s文件中,再用vim a.s查看a.s文件:

在這里插入圖片描述

程序會(huì)一直在這一句代碼中死循環(huán):

在這里插入圖片描述

加入volatile后:

在這里插入圖片描述

再用相同的命令查看a.s文件:

在這里插入圖片描述

可以看到每次循環(huán)都會(huì)讀取pass的數(shù)據(jù)。

結(jié)論: volatile 忽略編譯器的優(yōu)化,保持內(nèi)存可見性。

另外,const和volatile是不沖突的:

const volatile int a = 10; 

const關(guān)鍵字要求變量a不能直接被寫入,而volatile關(guān)鍵字要求每次讀取數(shù)據(jù)的時(shí)候,都要從a所在的內(nèi)存中讀取,并不會(huì)改變變量a的值。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 劍指offer之判斷鏈表是否包含環(huán)

    劍指offer之判斷鏈表是否包含環(huán)

    今天小編就為大家分享一篇關(guān)于劍指offer之判斷鏈表是否包含環(huán),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • 詳解Qt中QStackedWidget控件的使用

    詳解Qt中QStackedWidget控件的使用

    這篇文章主要為大家詳細(xì)介紹了Qt中QStackedWidget控件的具體使用,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-02-02
  • C++ sizeof 實(shí)例解析

    C++ sizeof 實(shí)例解析

    下面5個(gè)列子針對(duì)C++,沒有涉及到sizeof字節(jié)對(duì)齊及基本數(shù)據(jù)類型即只針對(duì)C++特有,并且針對(duì)的是32位機(jī)
    2013-07-07
  • C語言冷知識(shí)之預(yù)處理字符串操作符詳解

    C語言冷知識(shí)之預(yù)處理字符串操作符詳解

    當(dāng)年學(xué)習(xí)C語言的第一門課就提到過標(biāo)記(Token)的概念,不過,相信在多年之后你再次聽到這個(gè)術(shù)語時(shí)會(huì)一臉懵逼,比如我。因此特地翻了翻資料,整理下來這些筆記,希望對(duì)大家有所幫助
    2022-11-11
  • 一文詳解C++中的類型轉(zhuǎn)化

    一文詳解C++中的類型轉(zhuǎn)化

    說起類型轉(zhuǎn)化,我們?cè)贑語言之前的學(xué)習(xí)中可以了解到,類型轉(zhuǎn)換可以分為兩種情況:隱式類型轉(zhuǎn)化;顯示類型轉(zhuǎn)化。但是為什么在c++中還要繼續(xù)對(duì)類型轉(zhuǎn)化做文章呢?我們一起來看
    2023-04-04
  • C語言數(shù)組詳細(xì)介紹

    C語言數(shù)組詳細(xì)介紹

    大家好,本篇文章主要講的是C語言數(shù)組詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++作用域與函數(shù)重載的實(shí)現(xiàn)

    C++作用域與函數(shù)重載的實(shí)現(xiàn)

    本文主要介紹了C++作用域與函數(shù)重載的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C語言/C++如何生成隨機(jī)數(shù)

    C語言/C++如何生成隨機(jī)數(shù)

    這篇文章主要介紹了C語言/C++如何生成隨機(jī)數(shù),C語言/C++產(chǎn)生隨機(jī)數(shù)主要用到的是rand()函數(shù), srand()函數(shù),C語言/C++里沒有自帶的random(int number)函數(shù),如何解決?感興趣的小伙伴們可以參考一下
    2016-04-04
  • C++與Lua交互內(nèi)存分配詳解

    C++與Lua交互內(nèi)存分配詳解

    C/C++ 與 Lua 的交互是通過 lua_State 這一句柄進(jìn)行交互,我們常規(guī)的創(chuàng)建都是通過 luaL_newstate 這一輔助函數(shù),這篇文章主要給大家詳細(xì)介紹了C++與Lua交互內(nèi)存分配,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11
  • C++實(shí)現(xiàn)LeetCode(53.最大子數(shù)組)

    C++實(shí)現(xiàn)LeetCode(53.最大子數(shù)組)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(53.最大子數(shù)組),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

和硕县| 县级市| 邛崃市| 新乡县| 无为县| 鞍山市| 广德县| 靖西县| 汶川县| 桑植县| 宣威市| 绥阳县| 新田县| 宜宾市| 永胜县| 馆陶县| 环江| 天台县| 泰兴市| 香港 | 建阳市| 兰西县| 佛学| 上杭县| 清水河县| 乐陵市| 天等县| 南江县| 海阳市| 马关县| 布尔津县| 扶余县| 东阿县| 邹平县| 镇平县| 长海县| 龙口市| 历史| 忻城县| 卢龙县| 沁水县|