中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中volatile和mutable的區別有哪些

發布時間:2020-11-04 18:32:20 來源:億速云 閱讀:642 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關C++中volatile和mutable的區別有哪些,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

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

mutable

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

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

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

volatile

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

在多線程環境下,volatile可用作內存同步手段。例如多線程爆破密碼:

volatile bool found = false;

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

volatile的修飾下,每次循環都會檢查內存中的值,達到同步的效果。

需要注意的是,volatile的值可能隨時會變,期間會導致非預期的結果。例如下面的例子求平方和:

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

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

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

總結

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

關于C++中volatile和mutable的區別有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泸溪县| 东台市| 扶沟县| 尚志市| 夹江县| 平潭县| 滨海县| 宜兰市| 璧山县| 东乌珠穆沁旗| 丹阳市| 格尔木市| 桃源县| 玉林市| 延吉市| 二连浩特市| 晋州市| 新沂市| 贵阳市| 达孜县| 阳原县| 鸡东县| 瑞昌市| 华安县| 惠州市| 平塘县| 花莲市| 福海县| 武定县| 金堂县| 新宁县| 广水市| 海伦市| 浮山县| 娱乐| 德格县| 犍为县| 新巴尔虎右旗| 徐州市| 青铜峡市| 禄丰县|