淺談C++中的mutable和volatile關(guān)鍵字
1.mutable
在C++中,mutable是為了突破const的限制而設(shè)置的。被mutable修飾的變量,將永遠(yuǎn)處于可變的狀態(tài),即使在一個(gè)const函數(shù)中,甚至結(jié)構(gòu)體變量或者類對(duì)象為const,其mutable成員也可以被修改。mutable在類中只能夠修飾非靜態(tài)數(shù)據(jù)成員。
#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 函數(shù),不能修改類的對(duì)象的數(shù)據(jù)成員,但由于a被mutable修飾,可以修改,但不能修改b { a += b; } void print() { cout << a << "," << b << endl; } };
我們知道,如果類的成員函數(shù)不會(huì)改變對(duì)象的狀態(tài),那么這個(gè)成員函數(shù)一般會(huì)聲明成const的。但是,有些時(shí)候,我們需要在const的函數(shù)里面修改一些跟類狀態(tài)無(wú)關(guān)的數(shù)據(jù)成員,那么這個(gè)數(shù)據(jù)成員就應(yīng)該被mutalbe來(lái)修飾。
2.volatile
volatile原意是“易變的”,但這種解釋簡(jiǎn)直有點(diǎn)誤導(dǎo)人,應(yīng)該解釋為“直接存取原始內(nèi)存地址”比較合適?!耙鬃儭笔窍鄬?duì)與普通變量而言其值存在編譯器(優(yōu)化功能)未知的改變情況(即不是通過(guò)執(zhí)行代碼賦值改變其值的情況),而是因外在因素引起的,如多線程,中斷等。編譯器進(jìn)行優(yōu)化時(shí),它有時(shí)會(huì)取一些值的時(shí)候,直接從寄存器里進(jìn)行存取,而不是從內(nèi)存中獲取,這種優(yōu)化在單線程的程序中沒(méi)有問(wèn)題,但到了多線程程序中,由于多個(gè)線程是并發(fā)運(yùn)行的,就有可能一個(gè)線程把某個(gè)公共的變量已經(jīng)改變了,這時(shí)其余線程中寄存器的值已經(jīng)過(guò)時(shí),但這個(gè)線程本身還不知道,以為沒(méi)有改變,仍從寄存器里獲取,就導(dǎo)致程序運(yùn)行會(huì)出現(xiàn)未定義的行為。并不是因?yàn)橛胿olatile修飾了的變量就是“易變”了,假如沒(méi)有外因,即使用volatile定義,它也不會(huì)變化。而加了volatile修飾的變量,編譯器將不對(duì)其相關(guān)代碼執(zhí)行優(yōu)化,而是生成對(duì)應(yīng)代碼直接存取原始內(nèi)存地址。
一般說(shuō)來(lái),volatile用在如下的幾個(gè)地方:
1、中斷服務(wù)程序中修改的供其它程序檢測(cè)的變量需要加volatile;
2、多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志應(yīng)該加volatile;
3、存儲(chǔ)器映射的硬件寄存器通常也要加volatile說(shuō)明,因?yàn)槊看螌?duì)它的讀寫(xiě)都可能有不同意義;
以上這篇淺談C++中的mutable和volatile關(guān)鍵字就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02C語(yǔ)言內(nèi)存函數(shù) memcpy,memmove ,memcmp
這篇文章主要介紹了C語(yǔ)言內(nèi)存函數(shù) memcpy,memmove ,memcmp,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作
這篇文章給大家介紹了使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作,文中通過(guò)圖文結(jié)合的方式介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-12-12Linux下C語(yǔ)言實(shí)現(xiàn)C/S模式編程
這篇文章主要為大家詳細(xì)介紹了Linux下C語(yǔ)言實(shí)現(xiàn)C/S模式編程的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01C語(yǔ)言嵌入informix基礎(chǔ)入門示例講解
這篇文章主要介紹了C語(yǔ)言嵌入informix基礎(chǔ)方法,大家參考使用2013-11-11七夕表白! C語(yǔ)言實(shí)現(xiàn)愛(ài)情紅玫瑰
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)愛(ài)情紅玫瑰,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08C語(yǔ)言庫(kù)函數(shù)getchar()新見(jiàn)解
用getchar()函數(shù)讀取字符串時(shí),字符串會(huì)存儲(chǔ)在輸入緩沖區(qū)中,包括輸入的回車字符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中g(shù)etchar()的用法以及案例的相關(guān)資料,需要的朋友可以參考下2022-07-07