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

聊聊C++的mutable和volatile

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

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

mutable

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

考慮一個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)化(緩存),每次取值應該直接讀取內(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的值可能隨時會變,期間會導致非預期的結(jié)果。例如下面的例子求平方和:

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

a和b都是隨時可變的,所以上述代碼中的第一個a + b可能和第二個不同,導致出現(xiàn)非預期的結(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)容,更多關于C++ mutable和volatile的資料請關注腳本之家其它相關文章!

相關文章

  • C++實現(xiàn)一個簡易版的事件(Event)的示例代碼

    C++實現(xiàn)一個簡易版的事件(Event)的示例代碼

    之前在?windows系統(tǒng)中開發(fā)應用時,?遇到需要進行線程同步的時候幾乎都是使用的事件內(nèi)核對象?Event。本文為大家整理了C++實現(xiàn)一個簡易版的事件(Event)的相關資料,需要的可以參考一下
    2022-11-11
  • 從頭學習C語言之if語句的使用

    從頭學習C語言之if語句的使用

    這篇文章主要為大家詳細介紹了C語言之if語句的使用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言二叉樹的概念結(jié)構詳解

    C語言二叉樹的概念結(jié)構詳解

    二叉樹可以簡單理解為對于一個節(jié)點來說,最多擁有一個上級節(jié)點,同時最多具備左右兩個下級節(jié)點的數(shù)據(jù)結(jié)構。本文將詳細介紹一下C++中二叉樹的實現(xiàn)和遍歷,需要的可以參考一下
    2022-08-08
  • C++萬能庫頭文件在vs中的安裝步驟(圖文)

    C++萬能庫頭文件在vs中的安裝步驟(圖文)

    這篇文章主要介紹了C++萬能庫頭文件在vs中的安裝步驟(圖文),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • 利用Matlab復刻舉牌加油小人生成器

    利用Matlab復刻舉牌加油小人生成器

    upuptoyou是一款非常有創(chuàng)意的小工具,可以在線生成舉牌小人,看起來很可愛,也比較有趣,并能用于表白,或節(jié)日送祝福等場景。本文將用Matlab復刻這一小工具,需要的可以參考一下
    2022-03-03
  • C++二叉樹的前序中序后序非遞歸實現(xiàn)方法詳細講解

    C++二叉樹的前序中序后序非遞歸實現(xiàn)方法詳細講解

    前序遍歷的順序是根、左、右。任何一顆樹都可以認為分為左路節(jié)點,左路節(jié)點的右子樹。先訪問左路節(jié)點,再來訪問左路節(jié)點的右子樹。把訪問左路節(jié)點的右子樹看成一個子問題,就可以完整遞歸訪問了
    2023-03-03
  • C語言編程入門必背的示例代碼整理大全

    C語言編程入門必背的示例代碼整理大全

    這篇文章主要為大家整理并介紹了C語言編程必背的示例代碼大全,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • OpenCV實現(xiàn)圖像邊緣檢測

    OpenCV實現(xiàn)圖像邊緣檢測

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像邊緣檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++實現(xiàn)迷宮生成與解決

    C++實現(xiàn)迷宮生成與解決

    這篇文章主要為大家詳細介紹了C++實現(xiàn)迷宮生成與解決,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語言實現(xiàn)點菜系統(tǒng)

    C語言實現(xiàn)點菜系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)點菜系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論