volatile 告訴編譯器:該變數可能被「編譯器未知的因素」(硬體暫存器、中斷服務程式、其他執行緒、訊號處理器)隨時修改。因此禁止優化,每次存取必須從記憶體實際讀寫,不能使用暫存器快取值。
volatile:編譯器將值載入暫存器,後續直接使用暫存器值。volatile:每次存取皆產生記憶體讀/寫指令。// 無 volatile:Release 模式下第二次列印仍為 10(優化掉第二次讀取)
int i = 10;
int a = i;
__asm { mov dword ptr [ebp-4], 20h } // 直接改記憶體,編譯器不知情
int b = i; // 優化後直接用暫存器舊值
printf("%d %d", a, b); // Debug: 10 32 Release: 10 10
// 加上 volatile:Debug/Release 均輸出 10 32
volatile int i = 10;
int a = i;
__asm { mov dword ptr [ebp-4], 20h }
int b = i; // 強制重新從記憶體讀取
printf("%d %d", a, b); // 10 32
volatile 不保證 原子性或記憶體順序,需配合 std::atomic 或鎖)setjmp/longjmp 或訊號處理器修改的變數volatile 能解決多執行緒同步問題 → 錯誤,需用原子操作或互斥鎖。volatile 變數不會被快取 → 只是強制記憶體存取,CPU 快取一致性協定(MESI)仍生效。