變量值可能因內部邏輯改變,也可能因外部因素 (硬體、中斷、其他執行緒) 改變。唯有 volatile 修飾的變量,「表裡如一」,每次讀取都誠實地從記憶體取值,不玩優化「偷懶」,故獲「專一王子」美譽。
volatile 告訴編譯器:**該變量值可能隨時被不可預知的因素修改,請勿優化,每次訪問必須直接讀寫記憶體/暫存器。**
int a = 10;
int b = a;
int c = a;
編譯器掃描發現 a 未被修改,為提速 (CPU 讀記憶體慢,讀暫存器快),會優化為直接將常數 10 賦給 c,省去再次讀取 a 的記憶體操作。單執行緒下無害,但多執行緒或硬體暫存器場景下將導致嚴重錯誤。
volatile 時,A 可能持續讀取暫存器舊值,看不到 B 的更新。volatile 確保主程式及時看到變化。// 硬體暫存器映射範例
volatile unsigned int *UART_STATUS = (unsigned int *)0x40001000;
// 主迴圈輪詢
while (!(*UART_STATUS & 0x01)) {
// 等待數據就緒,每次迴圈必須重新讀取硬體地址
}
// 多執行緒標誌位
volatile bool stop_flag = false;
void thread_func() {
while (!stop_flag) { /* 工作 */ }
}
// 主執行緒安全停止
stop_flag = true; // 編譯器不會優化掉這次寫入,也不會優化讀取端
volatile int i; i++; 的原子性。需配合鎖或原子操作。memory_barrier 或 C11 atomic_thread_fence。volatile int *p:指向的 int 值 易變。int *volatile p:指標 p 本身 易變 (地址可能變)。volatile int *volatile p:雙重易變。volatile 是嵌入式與系統級開發的「護身符」。它犧牲優化效率,換取數據在「異步世界」中的一致性。用對場景,是專業工程師的標誌;濫用則白白損失效能。