當(dāng)你使用 volatile 關(guān)鍵字時(shí),你告訴編譯器該變量的值可能會(huì)在程序的執(zhí)行過(guò)程中被外部因素更改,因此編譯器不應(yīng)該對(duì)該變量的讀寫(xiě)進(jìn)行優(yōu)化。下面是一些使用 volatile 的例子,以及對(duì)它們的一些文字描述:
1,防止編譯器優(yōu)化
#include int main() { int a = 0; while (a == 0) { // 此處的循環(huán)條件可能在外部被修改,使用 volatile 防止編譯器優(yōu)化 } printf("Loop exited!\n"); return 0;}
這個(gè)例子中,a 的值可能會(huì)在循環(huán)外部被修改,但是由于循環(huán)內(nèi)沒(méi)有對(duì) a 進(jìn)行修改的語(yǔ)句,編譯器可能會(huì)認(rèn)為 a 的值在循環(huán)中永遠(yuǎn)不會(huì)變化,進(jìn)而優(yōu)化掉整個(gè)循環(huán)。通過(guò)使用 volatile,我們告訴編譯器不要對(duì)這個(gè)變量的讀寫(xiě)進(jìn)行優(yōu)化。
2. 提醒編譯器不要緩存
#include #include #include volatile int flag = 1; // 用于標(biāo)識(shí)是否可以退出循環(huán)void *threadFunction(void *arg) { sleep(2); // 模擬一些操作 flag = 0; // 線(xiàn)程中修改 flag 的值 return NULL;}int main() { pthread_t tid; pthread_create(&tid, NULL, threadFunction, NULL); while (flag) { // 在循環(huán)中讀取 flag 的值,使用 volatile 防止編譯器緩存 } printf("Thread signaled exit!\n"); pthread_join(tid, NULL); return 0;}
在這個(gè)例子中,flag 的值在另一個(gè)線(xiàn)程中被修改。由于涉及多線(xiàn)程,編譯器可能會(huì)對(duì) flag 進(jìn)行緩存優(yōu)化。通過(guò)使用 volatile,我們提醒編譯器不要對(duì)這個(gè)變量進(jìn)行緩存,而是每次都從內(nèi)存中重新加載。
3. 內(nèi)存映射的硬件寄存器
#include volatile unsigned int *hardwareRegister = (volatile unsigned int *)0x12345678;int main() { unsigned int value = *hardwareRegister; // 從硬件寄存器讀取值 // 對(duì)硬件寄存器進(jìn)行操作... *hardwareRegister = 42; // 將值寫(xiě)入硬件寄存器 return 0;}
在這個(gè)例子中,hardwareRegister 是一個(gè)指向內(nèi)存映射硬件寄存器的指針。硬件寄存器的值可能在程序執(zhí)行期間被硬件修改,因此我們使用 volatile 保證了對(duì)硬件寄存器的讀寫(xiě)不會(huì)被編譯器優(yōu)化,而是每次都從內(nèi)存中重新加載。
-
C語(yǔ)言
+關(guān)注
關(guān)注
183文章
7646瀏覽量
146090 -
編譯器
+關(guān)注
關(guān)注
1文章
1672瀏覽量
51883 -
變量
+關(guān)注
關(guān)注
0文章
616瀏覽量
29565
發(fā)布評(píng)論請(qǐng)先 登錄
教科書(shū)不會(huì)講的C語(yǔ)言關(guān)鍵字volatile用法
C語(yǔ)言關(guān)鍵字volatile的用法
C語(yǔ)言面試最常問(wèn)的關(guān)鍵字
C語(yǔ)言關(guān)鍵字專(zhuān)題
C語(yǔ)言volatile關(guān)鍵字詳解 精選資料分享
標(biāo)準(zhǔn)C語(yǔ)言總共有32個(gè)關(guān)鍵字
C語(yǔ)言32個(gè)關(guān)鍵字九種控制語(yǔ)句34種運(yùn)算符
淺析C語(yǔ)言中typedef關(guān)鍵字的作用
C語(yǔ)言32個(gè)關(guān)鍵字可以分為這幾類(lèi)
淺析C語(yǔ)言中的regiseter關(guān)鍵字
快速掌握C語(yǔ)言關(guān)鍵字
你還記得這個(gè)C語(yǔ)言關(guān)鍵字嗎?
評(píng)論