程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 淺談C++中的mutable和volatile症結字

淺談C++中的mutable和volatile症結字

編輯:關於C++

淺談C++中的mutable和volatile症結字。本站提示廣大學習愛好者:(淺談C++中的mutable和volatile症結字)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談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症結字就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved