欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

內(nèi)存中的數(shù)據(jù)要放入CPU中進(jìn)行運(yùn)算或控制,而這個數(shù)據(jù)的值是被放入寄存器中,然后再將寄存器中的數(shù)據(jù)進(jìn)行運(yùn)算或控制的,對于一個死循環(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é)起來就是,遇到這個關(guān)鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進(jìn)行優(yōu)化,從而可以提供對其地址的穩(wěn)定訪問;如果不使用valatile,則編譯器將對所聲明的語句進(jìn)行優(yōu)化。

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

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

比如下面的代碼:

在這里插入圖片描述

我們在gcc下使用命令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án):

在這里插入圖片描述

加入volatile后:

在這里插入圖片描述

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

在這里插入圖片描述

可以看到每次循環(huán)都會讀取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ù)的時候,都要從a所在的內(nèi)存中讀取,并不會改變變量a的值。

總結(jié)

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

相關(guān)文章

  • C++連接mysql數(shù)據(jù)庫的兩種方法小結(jié)

    C++連接mysql數(shù)據(jù)庫的兩種方法小結(jié)

    這篇文章主要介紹了C++連接mysql數(shù)據(jù)庫的兩種方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 深入理解C++中的new和delete并實(shí)現(xiàn)對象池

    深入理解C++中的new和delete并實(shí)現(xiàn)對象池

    這篇文章主要介紹了C++中的new和delete并實(shí)現(xiàn)對象池,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 詳解C++中類的六大默認(rèn)成員函數(shù)

    詳解C++中類的六大默認(rèn)成員函數(shù)

    這篇文章主要介紹了C++類中的六大默認(rèn)成員函數(shù)的原理雨使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • C++中關(guān)于getchar()的使用方法

    C++中關(guān)于getchar()的使用方法

    這篇文章主要介紹了C++中關(guān)于getchar()的使用方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++?STL?iota?和?atoi?用法示例詳解

    C++?STL?iota?和?atoi?用法示例詳解

    atoi是一個C/C++標(biāo)準(zhǔn)庫中的函數(shù),用于將一個以ASCII字符串表示的整數(shù)轉(zhuǎn)換為整數(shù)類型,這篇文章主要介紹了C++?STL?iota?和?atoi?用法,需要的朋友可以參考下
    2024-08-08
  • C語言實(shí)現(xiàn)數(shù)據(jù)的壓縮與解壓

    C語言實(shí)現(xiàn)數(shù)據(jù)的壓縮與解壓

    數(shù)據(jù)壓縮是通過一系列的算法和技術(shù)將原始數(shù)據(jù)轉(zhuǎn)換為更緊湊的表示形式,以減少數(shù)據(jù)占用的存儲空間,數(shù)據(jù)解壓縮則是將壓縮后的數(shù)據(jù)恢復(fù)到原始的表示形式,本文給大家詳細(xì)介紹了C語言實(shí)現(xiàn)數(shù)據(jù)壓縮與解壓,需要的朋友可以參考下
    2023-08-08
  • visualstudio2022工程重命名的圖文步驟

    visualstudio2022工程重命名的圖文步驟

    很多時候需要用到項(xiàng)目重命名,本文主要介紹了visualstudio2022工程重命名的圖文步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • C語言實(shí)現(xiàn)獲取文件大小與創(chuàng)建修改時間

    C語言實(shí)現(xiàn)獲取文件大小與創(chuàng)建修改時間

    這篇文章主要為大家詳細(xì)介紹了如何通過C語言實(shí)現(xiàn)獲取文件大小、創(chuàng)建時間與修改時間,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • 詳解C++中OpenSSL動態(tài)鏈接庫的使用

    詳解C++中OpenSSL動態(tài)鏈接庫的使用

    這篇文章主要介紹了OpenSSL動態(tài)鏈接庫的使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • c++如何實(shí)現(xiàn)跳表(skiplist)

    c++如何實(shí)現(xiàn)跳表(skiplist)

    這篇文章主要介紹了c++如何實(shí)現(xiàn)跳表,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08

最新評論