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

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

淺談C++中的mutable和volatile關鍵字

2020-05-23 14:03:11
字體:
來源:轉載
供稿:網友
下面小編就為大家帶來一篇淺談C++中的mutable和volatile關鍵字。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
 

1.mutable

在C++中,mutable是為了突破const的限制而設置的。被mutable修飾的變量,將永遠處于可變的狀態,即使在一個const函數中,甚至結構體變量或者類對象為const,其mutable成員也可以被修改。mutable在類中只能夠修飾非靜態數據成員

#include <iostream> using namespace std;class test{  mutable int a;  int b;public:  test(int _a,int _b) :a(_a),b(_b){};  void fun() const            //fun是const 函數,不能修改類的對象的數據成員,但由于a被mutable修飾,可以修改,但不能修改b  {    a += b;  }  void print()  {    cout << a << "," << b << endl;  }};

我們知道,如果類的成員函數不會改變對象的狀態,那么這個成員函數一般會聲明成const的。但是,有些時候,我們需要在const的函數里面修改一些跟類狀態無關的數據成員,那么這個數據成員就應該被mutalbe來修飾。

2.volatile

volatile原意是“易變的”,但這種解釋簡直有點誤導人,應該解釋為“直接存取原始內存地址”比較合適。“易變”是相對與普通變量而言其值存在編譯器(優化功能)未知的改變情況(即不是通過執行代碼賦值改變其值的情況),而是因外在因素引起的,如多線程,中斷等。編譯器進行優化時,它有時會取一些值的時候,直接從寄存器里進行存取,而不是從內存中獲取,這種優化在單線程的程序中沒有問題,但到了多線程程序中,由于多個線程是并發運行的,就有可能一個線程把某個公共的變量已經改變了,這時其余線程中寄存器的值已經過時,但這個線程本身還不知道,以為沒有改變,仍從寄存器里獲取,就導致程序運行會出現未定義的行為。并不是因為用volatile修飾了的變量就是“易變”了,假如沒有外因,即使用volatile定義,它也不會變化。而加了volatile修飾的變量,編譯器將不對其相關代碼執行優化,而是生成對應代碼直接存取原始內存地址。

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

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

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

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

以上這篇淺談C++中的mutable和volatile關鍵字就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 威远县| 鄂州市| 句容市| 凤阳县| 习水县| 阜宁县| 白城市| 读书| 永福县| 南丰县| 民县| 新郑市| 涟源市| 崇阳县| 定安县| 鸡泽县| 迁安市| 浮山县| 东城区| 云和县| 临沭县| 博客| 景洪市| 古田县| 太谷县| 于田县| 丽水市| 盱眙县| 珠海市| 全州县| 海原县| 丰台区| 迭部县| 武隆县| 河源市| 新乐市| 莱州市| 拜城县| 抚顺县| 远安县| 璧山县|