volatile提醒編譯器它後面所定義的變數隨時都有可能改變,因此編譯後的程式每次需要儲存或讀取這個變數的時候,告訴編譯器對該變數不做最佳化,都會直接從變數記憶體地址中讀取資料,從而可以提供對特殊地址的穩定訪問。。如果沒有volatile關鍵字,則編譯器可能最佳化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數由別的程式更新了的話,將出現不一致的現象。
程式碼示例:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段程式碼可能返不是你所期望的平方值!正確的程式碼如下:
long square(volatile int *ptr)
int a;
return a * a;
注意:頻繁地使用volatile很可能會增加程式碼尺寸和降低效能,因此要合理的使用volatile。
volatile提醒編譯器它後面所定義的變數隨時都有可能改變,因此編譯後的程式每次需要儲存或讀取這個變數的時候,告訴編譯器對該變數不做最佳化,都會直接從變數記憶體地址中讀取資料,從而可以提供對特殊地址的穩定訪問。。如果沒有volatile關鍵字,則編譯器可能最佳化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數由別的程式更新了的話,將出現不一致的現象。
程式碼示例:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段程式碼可能返不是你所期望的平方值!正確的程式碼如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
注意:頻繁地使用volatile很可能會增加程式碼尺寸和降低效能,因此要合理的使用volatile。