2 回答

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個(gè)贊
volatile 影響編譯器編譯的結(jié)果,指出,volatile 變量是隨時(shí)可能發(fā)生變化的,與volatile變量有關(guān)的運(yùn)算,不要進(jìn)行編譯優(yōu)化,以免出錯(cuò),(VC++ 在產(chǎn)生release版可執(zhí)行碼時(shí)會進(jìn)行編譯優(yōu)化,加volatile關(guān)鍵字的變量有關(guān)的運(yùn)算,將不進(jìn)行編譯優(yōu)化。)。
例如:
volatile int i=10;
int j = i;
...
int k = i;
volatile 告訴編譯器i是隨時(shí)可能發(fā)生變化的,每次使用它的時(shí)候必須從i的地址中讀取,因而編譯器生成的可執(zhí)行碼會重新從i的地址讀取數(shù)據(jù)放在k中。
而優(yōu)化做法是,由于編譯器發(fā)現(xiàn)兩次從i讀數(shù)據(jù)的代碼之間的代碼沒有對i進(jìn)行過操作,它會自動把上次讀的數(shù)據(jù)放在k中。而不是重新從i里面讀。這樣以來,如果i是一個(gè)寄存器變量或者表示一個(gè)端口數(shù)據(jù)就容易出錯(cuò),所以說volatile可以保證對特殊地址的穩(wěn)定訪問,不會出錯(cuò)。

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
用volatile關(guān)鍵字定義變量,相當(dāng)于告訴編譯器,這個(gè)變量的值會隨時(shí)發(fā)生變化,每次使用時(shí)都需要去內(nèi)存里重新讀取它的值,并不要隨意針對它作優(yōu)化。
不使用volatile定義的變量,可能因?yàn)榫幾g器優(yōu)化而出現(xiàn)一些問題,具體可以看給出的參考資料,里面有一個(gè)例子。
建議使用volatile變量的場所:
(1) 并行設(shè)備的硬件寄存器
(2) 一個(gè)中斷服務(wù)子程序中會訪問到的非自動變量(全局變量)
(3) 多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量
- 2 回答
- 0 關(guān)注
- 463 瀏覽
添加回答
舉報(bào)