c語言 volatile關(guān)鍵字 C語言中volatile關(guān)鍵字的用法是什么?
C語言中volatile關(guān)鍵字的用法是什么?Volatile提醒編譯器,它后面定義的變量隨時可能發(fā)生變化,因此每次編譯的程序需要存儲或讀取變量時,它都會告訴編譯器直接從變量內(nèi)存地址讀取數(shù)據(jù),而不必優(yōu)化
C語言中volatile關(guān)鍵字的用法是什么?
Volatile提醒編譯器,它后面定義的變量隨時可能發(fā)生變化,因此每次編譯的程序需要存儲或讀取變量時,它都會告訴編譯器直接從變量內(nèi)存地址讀取數(shù)據(jù),而不必優(yōu)化變量,從而提供對特殊地址的穩(wěn)定訪問。。如果編譯器暫時無法讀取變量的值,那么它將與存儲在其他寄存器中的值不一致。
代碼示例:
int square(volatile int*PTR)
]{
int a,b
a=*PTR
b=*PTR
返回a*b
}
由于*PTR的值可能會意外更改,因此a和b可能不同。因此,此代碼可能不是您期望的正方形!正確的代碼如下:
long square(volatile int*PTR)
{
int a
a=*PTR
return a*a
}
]注意:頻繁使用volatile可能會增加代碼大小,降低性能,所以合理使用volatile。
volatile關(guān)鍵字在Java中有什么作用?
Volatile是為了防止指令重新排序以確??梢娦?/p>
對于JVM級別,是為了防止編譯器重新排序
同時,對于某些CPU,它們會通過緩存鎖或線程來解決緩存可見性
但是,目前很多CPU已經(jīng)過優(yōu)化,由于cache一致性MESI會帶來性能開銷,因此采用storebuffer機制進行異步處理,這種機制會導(dǎo)致指令的無序執(zhí)行。這會導(dǎo)致可見性問題。
然后volatile將在CPU級別增加內(nèi)存屏障,以解決由CPU無序執(zhí)行引起的可見性問題