一直有這樣的乙個概念,volatile修飾的變數,程式在讀取該值的時候,不是在暫存器中讀取,而是從變數所在的記憶體中讀取。
下面寫個程式測試一下
#include int b = 100;
int main(void)
gcc編譯流程
1.預處理,生成預編譯檔案(.檔案):
gcc –e hello.c –o hello.i
2.編譯,生成彙編**(.s檔案):
gcc –s hello.i –o hello.s
3.彙編,生成目標檔案(.o檔案):
gcc –c hello.s –o hello.o
4.鏈結,生成可執行檔案:
g cc hello.o –o hello
這裡使用 arm-linux-gcc 編譯
arm-linux-gcc -e volatile.c -o volatile.i
arm-linux-gcc -s volatile.i -o volatile.s
檢視volatile.s,忽略入棧這些過程
可以看到這樣一句話
ldr r3, .l3
ldr r3, [r3, #0]
這句話的目的就是從變數b的位址中取出b的值
這個過程中涉及到b變數的操作都是從變數位址中取出,未出現之前說的從暫存器中獲取
下面在編譯的時候進行優化一下
優化後再看,發現出現了一開始討論的問題,程式在讀取某些變數值的時候,直接讀取之前儲存在暫存器中的值
使用volatile對變數進行修飾
#include volatile int b = 100;
int main(void)
編譯的時候進行優化一下
這裡可以看到,每次操作變數b的時候,都是
ldr r4, .l3
ldr rx, [r4, #0]
保證每次都是從變數所在的位址取值
通過上面3個實驗,可以確認volatile可以保證程式在執行過程中,對變數的取值是從變數所在的位址而不是暫存器
C語言的volatile關鍵字分析
volatile的含義和作用 volatile是易變的,不穩定的意思.volatile關鍵字和const一樣是一種型別修飾符,用它修飾的變數表示可以被某些編譯器未知的因素更改,比如作業系統 硬體或者其他執行緒等。對這個關鍵字宣告的變數,編譯器對訪問該變數的 就不再進行優化,從而可以提供對特殊位址的穩...
C語言volatile解析
volatile是乙個特徵修飾符 type specifier volatile的作用是作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。一般在以下場景中使用 僅看上述內容總感覺讓人不夠直觀,與其絞盡腦汁去細品,不如直接寫段 看看無volatile和帶volatile的變數在...
C語言中的volatile
c中 volatile 作用 volatile單詞的意思是易變的,不確定的。在c中,被 volatile 修飾的變數,表示 1 該變數的值是可變的,可能隨時在程式外部被改變 2 使用該變數的時候,必須每次從該變數所在的位址所指的記憶體去讀,不能把它放在暫存器或者 cache 中重複訪問,可以保證對特...