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

一篇文章帶你了解C語言中volatile關鍵字

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

C語言中volatile關鍵字

volatile關鍵字是C語言中非常冷門的關鍵字,因為用到這個關鍵字的場景并不多。

當不用這個關鍵字的時候,CPU可能會對我們的代碼做一定的優(yōu)化:

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

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

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

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

比如下面的代碼:

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

加入volatile后:

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

const volatile int a = 10; 

const關鍵字要求變量a不能直接被寫入,而volatile關鍵字要求每次讀取數據的時候,都要從a所在的內存中讀取,并不會改變變量a的值。

總結

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

相關文章

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

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

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

    詳解Qt中QStackedWidget控件的使用

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

    C++ sizeof 實例解析

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

    C語言冷知識之預處理字符串操作符詳解

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

    一文詳解C++中的類型轉化

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

    C語言數組詳細介紹

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

    C++作用域與函數重載的實現

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

    C語言/C++如何生成隨機數

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

    C++與Lua交互內存分配詳解

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

    C++實現LeetCode(53.最大子數組)

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

最新評論

盖州市| 微山县| 瓦房店市| 桃园县| 泰和县| 广南县| 密云县| 吉安市| 襄城县| 南通市| 隆回县| 福安市| 甘南县| 玛纳斯县| 扎鲁特旗| 门源| 仁布县| 禄丰县| 什邡市| 巢湖市| 建平县| 铜川市| 上虞市| 仲巴县| 延寿县| 罗甸县| 青冈县| 三台县| 平乡县| 商河县| 壶关县| 长垣县| 林周县| 吕梁市| 北碚区| 长武县| 阿拉善盟| 来宾市| 玛纳斯县| 秦皇岛市| 婺源县|