volatile關(guān)鍵字是一個(gè)類(lèi)型修飾符。 用它聲明的類(lèi)型變量表示隨時(shí)可能被某編譯器未知的因素的修改。比如OS,hardware or other threads.簡(jiǎn)單來(lái)說(shuō),如果一個(gè)變量使用了volatile進(jìn)行修飾,那么每次去讀取該值的時(shí)候是從對(duì)應(yīng)的地址中去讀取,而不會(huì)因?yàn)榫幾g器發(fā)現(xiàn)程序中間沒(méi)有對(duì)該值進(jìn)行操作所以不從內(nèi)存而是從上次讀到的數(shù)據(jù)進(jìn)行操作(這個(gè)就是編譯器的優(yōu)化,而使用了volatile關(guān)鍵字表示編譯器不對(duì)次進(jìn)行優(yōu)化,每次都從對(duì)應(yīng)的內(nèi)存中讀取)。這樣就保證了對(duì)特殊地址的穩(wěn)定訪問(wèn)。 代碼演示如下: demo1:不帶 volatile 修飾符 demo2:帶 volatile 修飾符 volatile使用場(chǎng)景1、中斷服務(wù)程序中修改的供其他程序檢測(cè)的變量 2、多任務(wù)環(huán)境下各任務(wù)之間共享的變量 3、存儲(chǔ)器映射的硬件寄存器 4、有些變量是用 volatile 關(guān)鍵字聲明的。當(dāng)兩個(gè)線程都要用到某一個(gè)變量且該變量的值會(huì)改變時(shí),應(yīng)該用 volatile 聲明,該關(guān)鍵字的作用是防止優(yōu)化編譯器把變量從內(nèi)存裝入 CPU 寄存器中。如果變量被裝入寄存器,那么兩個(gè)線程有可能一個(gè)使用內(nèi)存中的變量,一個(gè)使用寄存器中的變量,這會(huì)造成程序的錯(cuò)誤執(zhí)行。volatile 的意思是讓編譯器每次操作該變量時(shí)一定要從內(nèi)存中真正取出,而不是使用已經(jīng)存在寄存器中的值。 volatile指針1、volatile int * p;修飾指針指向的對(duì)象、數(shù)據(jù)是volatile的
2、char* volatile p; 修飾指針自身的值——代表地址的整數(shù)變量 注意事項(xiàng)1、非volatile int值可以賦值給volatile int,反之不行。 2、C++中一個(gè)有volatile標(biāo)識(shí)符的類(lèi)只能訪問(wèn)它接口的子集,一個(gè)由類(lèi)的實(shí)現(xiàn)者控制的子集。用戶只能用const_cast來(lái)獲得對(duì)類(lèi)型接口的完全訪問(wèn)。此外,volatile向const一樣會(huì)從類(lèi)傳遞到它的成員
|