volatile
是一個(gè)和和const
對(duì)應(yīng)的修飾符號(hào). 表示這個(gè)變量可能被某種不被編譯器控制的因素修改.比如操作系統(tǒng),硬件和其他的線程.遇到這個(gè)關(guān)鍵字,則編譯器對(duì)于關(guān)聯(lián)這個(gè)變量的代碼將不做優(yōu)化,從而提供對(duì)特殊地址的穩(wěn)定訪問(wèn).聲明語(yǔ)法為:int volatile vInt
.
編譯器遇到變量vInt
的時(shí)候,即使剛剛訪問(wèn)過(guò)這個(gè)變量,編譯器仍然對(duì)這個(gè)變量的初始內(nèi)存地址進(jìn)行訪問(wèn),因?yàn)檫@個(gè)變量可能是時(shí)時(shí)變化的.
比如在程序中插入了一段匯編代碼而編譯器并不知道,此時(shí)對(duì)于訪問(wèn)的變量可以加上volatile
修飾符.
一般有三個(gè)地方需要使用這個(gè)修飾符:
- 多任務(wù)環(huán)境下任務(wù)共享的標(biāo)志
- 硬件寄存器的訪問(wèn)
- 程序中供其他程序檢測(cè)的變量.
volatile
指針
和const
類(lèi)似,volatile
也有指針變量和變量指針兩說(shuō).
- 對(duì)象,數(shù)據(jù)是
const
或者volatile
const char* cpch
volatile char* vpch
- 指針本身(一個(gè)整型變量)是
const
或者volatile
char* const pchc;
char* volatile pchv;
可以把一個(gè)非
volatile int
賦值給volatile int
,但是對(duì)象不行
多線程下的 volatile
兩個(gè)線程共用一個(gè)變量的時(shí)候,這個(gè)變量必須要用volatile
修飾,以防止編譯器優(yōu)化,將寄存器中緩存的變量直接裝入CPU 寄存器中.
volatile
保證了編譯器每次都能直接從內(nèi)存地址中直接訪問(wèn)某個(gè)變量,而不是從寄存器中. 保證了一些共享的標(biāo)志位等數(shù)據(jù)的實(shí)時(shí)更新.