volatile的本意是「易變的」。由於訪問寄存器要比訪問內存單元快的多,因此編譯器通常都會做減小存取內存的優化,但有可能會讀髒數據。當要求使用volatile聲明變量值的時候,系統老是從新從它所在的內存讀取數據,即便它前面的指令剛剛從該處讀取過數據。精確地說就是,遇到這個關鍵字聲明的變量,編譯器對訪問該變量的代碼就再也不進行優化,從而能夠提供對特殊地址的穩定訪問;若是不使用volatile,則編譯器將對所聲明的語句進行優化。(簡潔的說就是:volatile關鍵詞影響編譯器編譯的結果,用volatile聲明的變量表示該變量隨時可能發生變化,與該變量有關的運算,不要進行編譯優化,以避免出錯)。
在某個函數中定義的變量可能在函數外面被改變的狀況,你就應該加上volatile,保證每次都必須從內存中讀取數據,而不能重複使用放在cache或寄存器中的備份。
舉個例子:markdown
int a = 1; a = 2; a = 3;
此時運行程序,編譯器優化性的讀代碼,變爲:ide
int a = 1; a = 3;
這意味着a = 2這一條指令就丟失了。而當你加上volatile關鍵字,代碼在編譯後仍是三條:函數
volatile int a = 1; a = 2; a = 3;
因此說,簡而言之,volatile關鍵字的做用,就是讓編譯器始終從內存讀取數據,以防止因優化帶來的錯誤。優化