當(dāng)你使用 volatile 關(guān)鍵字時(shí),你告訴編譯器該變量的值可能會(huì)在程序的執(zhí)行過程中被外部因素更改,因此編譯器不應(yīng)該對該變量的讀寫進(jìn)行優(yōu)化。下面是一些使用 volatile 的例子,以及對它們的一些文字描述:
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)沒有對 a 進(jìn)行修改的語句,編譯器可能會(huì)認(rèn)為 a 的值在循環(huán)中永遠(yuǎn)不會(huì)變化,進(jìn)而優(yōu)化掉整個(gè)循環(huán)。通過使用 volatile,我們告訴編譯器不要對這個(gè)變量的讀寫進(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; // 線程中修改 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è)線程中被修改。由于涉及多線程,編譯器可能會(huì)對 flag 進(jìn)行緩存優(yōu)化。通過使用 volatile,我們提醒編譯器不要對這個(gè)變量進(jìn)行緩存,而是每次都從內(nèi)存中重新加載。
3. 內(nèi)存映射的硬件寄存器
#include volatile unsigned int *hardwareRegister = (volatile unsigned int *)0x12345678;int main() { unsigned int value = *hardwareRegister; // 從硬件寄存器讀取值 // 對硬件寄存器進(jìn)行操作... *hardwareRegister = 42; // 將值寫入硬件寄存器 return 0;}
在這個(gè)例子中,hardwareRegister 是一個(gè)指向內(nèi)存映射硬件寄存器的指針。硬件寄存器的值可能在程序執(zhí)行期間被硬件修改,因此我們使用 volatile 保證了對硬件寄存器的讀寫不會(huì)被編譯器優(yōu)化,而是每次都從內(nèi)存中重新加載。
-
C語言
+關(guān)注
關(guān)注
183文章
7642瀏覽量
144525 -
編譯器
+關(guān)注
關(guān)注
1文章
1669瀏覽量
51057 -
變量
+關(guān)注
關(guān)注
0文章
615瀏覽量
29359
發(fā)布評論請先 登錄
教科書不會(huì)講的C語言關(guān)鍵字volatile用法
C語言關(guān)鍵字volatile的用法
C語言面試最常問的關(guān)鍵字
C語言關(guān)鍵字專題
C語言volatile關(guān)鍵字詳解 精選資料分享
C語言32個(gè)關(guān)鍵字九種控制語句34種運(yùn)算符
淺析C語言中typedef關(guān)鍵字的作用
C語言32個(gè)關(guān)鍵字可以分為這幾類
淺析C語言中的regiseter關(guān)鍵字
快速掌握C語言關(guān)鍵字

你還記得這個(gè)C語言關(guān)鍵字嗎?
評論