亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++中的volatile關(guān)鍵字及其作用

 更新時(shí)間:2023年04月19日 09:02:46   作者:芒果再努力  
本文介紹了C++中的volatile關(guān)鍵字,它用于標(biāo)識(shí)變量可能被意外修改,以及編譯器不應(yīng)進(jìn)行優(yōu)化。本文通過(guò)具體的代碼示例,闡述了volatile關(guān)鍵字的作用和使用方法,幫助讀者更好地了解該關(guān)鍵字在C++語(yǔ)言中的應(yīng)用場(chǎng)景和實(shí)現(xiàn)原理

volatile是C語(yǔ)言的一個(gè)關(guān)鍵字,該關(guān)鍵字的作用是保持內(nèi)存的可見(jiàn)性

例子:

我們對(duì)2號(hào)信號(hào)進(jìn)行了捕捉,當(dāng)該進(jìn)程收到2號(hào)信號(hào)時(shí)會(huì)將全局變量flag由0置1, 也就是說(shuō),在進(jìn)程收到2號(hào)信號(hào)之前,該進(jìn)程會(huì)一直處于死循環(huán)狀態(tài),直到收到2號(hào)信號(hào)時(shí)將flag置1才能夠正常退出

#include <stdio.h>
#include <signal.h>
int flag = 0;
void handle(int signo)
{
	printf("收到一個(gè) %d號(hào)信號(hào)\n",signo);
	flag = 1;
}
int main()
{
	signal(2,handle);//捕獲2號(hào)信號(hào)
	while(!flag);
	printf("進(jìn)程正常退出!\n");
	return 0;
}

上述代碼中:main函數(shù)和handler函數(shù)是兩個(gè)獨(dú)立的執(zhí)行流

判斷一個(gè)數(shù)據(jù)為真為假 -> 邏輯運(yùn)算 -> 需要CPU參與 ,常規(guī)情況下,需要從內(nèi)存加載到CPU,然后CPU內(nèi)部做判斷,然后再把結(jié)果返回

而while循環(huán)是在main函數(shù)當(dāng)中的,編譯器發(fā)現(xiàn):我們只對(duì)flag這個(gè)變量做檢測(cè),而不做修改, 編譯器直接優(yōu)化,把flag的值保存在寄存器中,直接在CPU檢測(cè)

此時(shí)main函數(shù)在檢測(cè)flag時(shí)只檢測(cè)寄存器里面的值,而handler執(zhí)行流只是將內(nèi)存中flag的值置為1了,那么此時(shí)就算進(jìn)程收到2號(hào)信號(hào)也不會(huì)跳出死循環(huán)

檢驗(yàn):在編譯器優(yōu)化級(jí)別較高的時(shí)候,就有可能將flag設(shè)置進(jìn)寄存器里面

如何提高編譯時(shí)的優(yōu)先級(jí)呢? 在編譯代碼時(shí)攜帶 -O3 選項(xiàng)使得編譯器的優(yōu)化級(jí)別最高 

此時(shí)再運(yùn)行該代碼,就算向進(jìn)程發(fā)生2號(hào)信號(hào),該進(jìn)程也不會(huì)終止

此時(shí)我們可以使用volatile關(guān)鍵字對(duì)flag變量進(jìn)行修飾,告知編譯器,對(duì)flag變量的任何操作都必須真實(shí)的在內(nèi)存中進(jìn)行,即保持了內(nèi)存的可見(jiàn)性

#include <stdio.h>
#include <signal.h>
volatile int flag = 0;//告知編譯器,對(duì)flag變量的任何操作都必須真實(shí)的在內(nèi)存中進(jìn)行
void handle(int signo)
{
	printf("收到一個(gè) %d號(hào)信號(hào)\n",signo);
	flag = 1;
}
int main()
{
	signal(2,handle);//捕獲2號(hào)信號(hào)
	while(!flag);
	printf("進(jìn)程正常退出!\n");
	return 0;
}

此時(shí)就算我們編譯代碼時(shí)攜帶 -O3 選項(xiàng),當(dāng)進(jìn)程收到2號(hào)信號(hào)將內(nèi)存中的flag變量置1時(shí),main函數(shù)執(zhí)行流也能夠檢測(cè)到內(nèi)存中flag變量的變化,進(jìn)而跳出死循環(huán)正常退出

到此這篇關(guān)于C++中的volatile關(guān)鍵字及其作用的文章就介紹到這了,更多相關(guān)C++ volatile關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于c++計(jì)算矩形重疊面積代碼實(shí)例

    基于c++計(jì)算矩形重疊面積代碼實(shí)例

    這篇文章主要介紹了基于c++計(jì)算矩形重疊面積代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • string中c_str(),data(),copy(p,n)函數(shù)的用法總結(jié)

    string中c_str(),data(),copy(p,n)函數(shù)的用法總結(jié)

    以下是對(duì)string中c_str(),data(),copy(p,n)函數(shù)的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • C++類與對(duì)象的詳細(xì)說(shuō)明

    C++類與對(duì)象的詳細(xì)說(shuō)明

    這篇文章主要為大家詳細(xì)介紹了C++的類與對(duì)象,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • 詳細(xì)分析c++ const 指針與指向const的指針

    詳細(xì)分析c++ const 指針與指向const的指針

    這篇文章主要介紹了c++ const 指針與指向const的指針的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C程序和C++程序之間的互相調(diào)用圖文教程

    C程序和C++程序之間的互相調(diào)用圖文教程

    這篇文章主要給大家介紹了關(guān)于C程序和C++程序之間互相調(diào)用的相關(guān)資料,我們平常在刷題的時(shí)候,難免遇到實(shí)現(xiàn)多組輸入這樣的問(wèn)題,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • C語(yǔ)言超細(xì)致講解函數(shù)遞歸

    C語(yǔ)言超細(xì)致講解函數(shù)遞歸

    程序調(diào)???的編程技巧稱為遞歸?recursion)函數(shù)??調(diào)???就是遞歸,你也可以理解成是?種嵌套結(jié)構(gòu),但遞歸分為倆部分,第?是“遞”,進(jìn)?嵌套結(jié)構(gòu)。第?是”歸“,最終會(huì)?步?步返回。第?次接觸遞歸都會(huì)很懵,慢慢理解這個(gè)過(guò)程就明?了
    2022-05-05
  • C語(yǔ)言掃雷詳細(xì)代碼分步實(shí)現(xiàn)流程

    C語(yǔ)言掃雷詳細(xì)代碼分步實(shí)現(xiàn)流程

    掃雷是電腦上很經(jīng)典的游戲,特意去網(wǎng)上玩了一會(huì),幾次調(diào)試之后,發(fā)現(xiàn)這個(gè)比三子棋要復(fù)雜一些,尤其是空白展開(kāi)算法上和堵截玩家有的一拼,與實(shí)際游戲差別較大,不能使用光標(biāo),下面來(lái)詳解每一步分析
    2022-02-02
  • Objective-C限制函數(shù)調(diào)用的頻率詳解

    Objective-C限制函數(shù)調(diào)用的頻率詳解

    這篇文章主要給大家介紹了關(guān)于Objective-C限制函數(shù)調(diào)用的頻率的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • C++ 之 Asio 庫(kù)(全面解析)

    C++ 之 Asio 庫(kù)(全面解析)

    下面小編就為大家?guī)?lái)一篇C++ 之 Asio 庫(kù)(全面解析)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • C++?Primer學(xué)習(xí)記錄之變量

    C++?Primer學(xué)習(xí)記錄之變量

    這篇文章主要為大家介紹了C++Primer之變量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01

最新評(píng)論