国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++中mutable與volatile的深入理解

2020-05-23 13:25:32
字體:
來源:轉載
供稿:網友

前言

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

下面話不多說了,來一起看看詳細的介紹吧

mutable

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

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

class Driver {private:...// real phone numberstring phone;// display phone numbermutable 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;}

一般說來,volatile用在如下的幾個地方: 

1. 中斷服務程序中修改的供其它程序檢測的變量需要加volatile; 

2. 多任務環境下各任務間共享的標志應該加volatile; 

3. 存儲器映射的硬件寄存器通常也要加volatile說明,因為每次對它的讀寫都可能有不同意義;

總結

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

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。

參考

https://en.cppreference.com/w/cpp/language/cv


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德令哈市| 衡阳市| 密山市| 昭平县| 七台河市| 贵阳市| 自治县| 威远县| 黄山市| 曲沃县| 广西| 岳西县| 宜城市| 泗阳县| 南丹县| 大方县| 山阳县| 尚义县| 巴林左旗| 鄂尔多斯市| 承德市| 泸水县| 昆明市| 灌云县| 延长县| 揭东县| 上高县| 健康| 酉阳| 巢湖市| 西乡县| 云和县| 象州县| 磴口县| 霍山县| 泗水县| 黔东| 祁阳县| 浙江省| 肥乡县| 阿合奇县|