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

聊聊C++的mutable和volatile

 更新時間:2020年09月09日 14:21:27   作者:tlanyan  
這篇文章主要介紹了C++的mutable和volatile的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下

C++中修飾數(shù)據(jù)可變的關(guān)鍵字有三個:constvolatilemutableconst比較好理解,表示其修飾的內(nèi)容不可改變(至少編譯期不可改變),而volatilemutable恰好相反,指示數(shù)據(jù)總是可變的。mutablevolatile均可以和const搭配使用,但兩者在使用上有比較大差別。

mutable

mutable只能作用在類成員上,指示其數(shù)據(jù)總是可變的。不能和const 同時修飾一個成員,但能配合使用:const修飾的方法中,mutable修飾的成員數(shù)據(jù)可以發(fā)生改變,除此之外不應(yīng)該對類/對象帶來副作用。

考慮一個mutable的使用場景:呼叫系統(tǒng)中存有司機(Driver)的信息,為了保護司機的隱私,司機對外展現(xiàn)的聯(lián)系號碼每隔五分鐘從空閑號碼池更新一次。根據(jù)需求,Driver類的實現(xiàn)如下偽代碼:

class Driver {
private:
 ...
 // real phone number
 string phone;
 // display phone number
 mutable string displayPhone;

public:
 string getDisplayPhone() const {
  if (needUpdate()) {
   lock.lock();
   if (needUpdate()) {
    updateDisplayPhone(); // displayPhone在這里被改變
   }
   lock.unlock();
  }
  return displayPhone;
 }
};

在上述代碼中,const方法中不允許對常規(guī)成員進行變動,但mutable成員不受此限制。對Driver類來說,其固有屬性(姓名、年齡、真實手機號等)未發(fā)生改變,符合const修飾。mutable讓一些隨時可變的展示屬性能發(fā)生改變,達到了靈活編程的目的。

volatile

volatile用于修飾成員或變量,指示其修飾對象可能隨時變化,編譯器不要對所修飾變量進行優(yōu)化(緩存),每次取值應(yīng)該直接讀取內(nèi)存。由于volatile的變化來自運行期,其可以與const一起使用。兩者一起使用可能讓人費解,如果考慮場景就容易許多:CPU和GPU通過映射公用內(nèi)存中的同一塊,GPU可能隨時往共享內(nèi)存中寫數(shù)據(jù)。對CPU上的程序來說,const修飾變量一直是右值,所以編譯通過。但其變量內(nèi)存中的值在運行期間可能隨時在改變,volatile修飾是正確做法。

在多線程環(huán)境下,volatile可用作內(nèi)存同步手段。例如多線程爆破密碼:

volatile bool found = false;

void run(string target) {
 while (!found) {
  // 計算字典口令的哈希
  if (target == hash) {
   found = true;
   break;
  }
 }
}

volatile的修飾下,每次循環(huán)都會檢查內(nèi)存中的值,達到同步的效果。

需要注意的是,volatile的值可能隨時會變,期間會導(dǎo)致非預(yù)期的結(jié)果。例如下面的例子求平方和:

double square(volatile double a, volatile double b) {
 return (a + b) * (a + b);
}

a和b都是隨時可變的,所以上述代碼中的第一個a + b可能和第二個不同,導(dǎo)致出現(xiàn)非預(yù)期的結(jié)果。這種情況下,正確做法是將值賦予常規(guī)變量,然后再相乘:

double square(volatile double a, volatile double b) {
 double c = a + b;
 return c * c;
}

總結(jié)

  1. mutable只能用與類變量,不能與const同時使用;在const修飾的方法中,mutable變量數(shù)值可以發(fā)生改變;
  2. volatile只是運行期變量的值隨時可能改變,這種改變即可能來自其他線程,也可能來自外部系統(tǒng)。

以上就是聊聊C++的mutable和volatile的詳細內(nèi)容,更多關(guān)于C++ mutable和volatile的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++與Lua交互原理實例詳解

    C++與Lua交互原理實例詳解

    這篇文章主要介紹了C++與Lua交互原理實例詳解,有感興趣的同學(xué)可以研究下
    2021-02-02
  • C語言手把手教你實現(xiàn)貪吃蛇AI(上)

    C語言手把手教你實現(xiàn)貪吃蛇AI(上)

    這篇文章主要介紹了C語言手把手教你實現(xiàn)貪吃蛇AI,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • c++ 編程 幾個有用的宏詳解

    c++ 編程 幾個有用的宏詳解

    下面小編就為大家?guī)硪黄猚++ 編程 幾個有用的宏詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • (C和指針) #if 0/#if 1...#end if

    (C和指針) #if 0/#if 1...#end if

    #if 0還有一個重要的用途就是用來當(dāng)成注釋,如果你想要注釋的程序很長,這個時候#if 0是最好的,保證不會犯錯誤
    2013-09-09
  • C程序?qū)崿F(xiàn)整數(shù)的素數(shù)和分解問題

    C程序?qū)崿F(xiàn)整數(shù)的素數(shù)和分解問題

    這篇文章主要介紹了C程序?qū)崿F(xiàn)整數(shù)的素數(shù)和分解問題,對于算法的學(xué)習(xí)有不錯的借鑒價值,需要的朋友可以參考下
    2014-09-09
  • 深入C++四種強制類型轉(zhuǎn)換的總結(jié)

    深入C++四種強制類型轉(zhuǎn)換的總結(jié)

    本篇文章是對C++中四種強制類型轉(zhuǎn)換進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言利用棧實現(xiàn)對后綴表達式的求解

    C語言利用棧實現(xiàn)對后綴表達式的求解

    這篇文章主要為大家詳細介紹了C語言利用棧實現(xiàn)對后綴表達式的求解,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++?手擼簡易服務(wù)器

    C++?手擼簡易服務(wù)器

    本文主要介紹了C++?手擼簡易服務(wù)器,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • C語言的基本語法詳解

    C語言的基本語法詳解

    本篇文章主要講解C語言 基本語法,這里提供簡單的示例和代碼來詳細講解C語言的基本語法,開始學(xué)習(xí)C語言的朋友可以看一下,希望能夠給你帶來幫助
    2021-09-09
  • 詳解C語言結(jié)構(gòu)體中的char數(shù)組如何賦值

    詳解C語言結(jié)構(gòu)體中的char數(shù)組如何賦值

    這篇文章主要給大家介紹了關(guān)于C語言結(jié)構(gòu)體中的char數(shù)組如何賦值的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03

最新評論

通辽市| 丰台区| 金阳县| 元阳县| 集贤县| 兴仁县| 习水县| 鄂温| 保靖县| 德庆县| 崇文区| 沙坪坝区| 吕梁市| 广宗县| 通河县| 武安市| 尼木县| 凤翔县| 儋州市| 弥渡县| 安平县| 蒙山县| 金川县| 新平| 察隅县| 呼和浩特市| 隆化县| 兴安县| 将乐县| 沙坪坝区| 德兴市| 和田县| 社旗县| 治多县| 宝丰县| 邢台县| 酒泉市| 资溪县| 武安市| 读书| 饶河县|