c語言volatile實戰分析

2021-08-28 00:01:12 字數 1480 閱讀 1148

一直有這樣的乙個概念,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 中重複訪問,可以保證對特...