C語言volatile解析

2022-07-18 16:57:28 字數 1536 閱讀 5384

volatile是乙個特徵修飾符(type specifier)。volatile的作用是作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。一般在以下場景中使用:

僅看上述內容總感覺讓人不夠直觀,與其絞盡腦汁去細品,不如直接寫段**,看看無volatile和帶volatile的變數在編譯後生成的彙編**有哪些區別。

因為筆者相對熟悉arm平台,所以選用了armcc編譯器,版本為:arm compiler 5.06 update 6 (build 750),優化等級為o3,作業系統平台為windows 10.0.18362,具體編譯命令如下:

armcc.exe -o3 -s d:\volatile測試\volatile.c -o d:\volatile測試\volatile.s

無volatile**如下:

int a=1

;int b=2

;int

c;int

main()

使用volatile修飾變數b,修改後的**(帶volatile)如下:

int a=1

;volatile

int b=2

;int

c;int

main()

無volatile**生成的關鍵彙編(部分)如下:

main proc

ldr r0,|l0.24|

ldr r1,[r0,#

0] ;

將變數a載入到暫存器r1

str r1,[r0,#4] ;

將暫存器r1儲存至變數b

str r1,[r0,#8] ;

將暫存器r1儲存至變數c

mov r0,#0

bx lr

endp

而帶volatile**生成的彙編如下:

main proc

ldr r0,|l0.28|

ldr r1,[r0,#

0] ;

將變數a載入暫存器r1

str r1,[r0,#4] ;

將暫存器r1儲存至變數b

ldr r1,[r0,#4] ; 將變數b載入暫存器r1

str r1,[r0,#8] ;

將暫存器r1儲存至變數c

mov r0,#0

bx lr

endp

對此,我們可以清楚的發現:在未使用volatile的彙編**中,當變數b賦值給變數c時,直接將暫存器r1更新至變數c;而在使用volatile修飾變數b以後,同樣變數b賦值給變數c時,先把變數b的值更新至暫存器r1(強制更新,紅底色**),再把暫存器r1更新至變數c。使用volatile修飾的變數會被編譯器標記為易改變的變數,編譯器在處理該變數賦值操作時會新增同步該變數(記憶體)至暫存器的操作。

C語言中的volatile

c中 volatile 作用 volatile單詞的意思是易變的,不確定的。在c中,被 volatile 修飾的變數,表示 1 該變數的值是可變的,可能隨時在程式外部被改變 2 使用該變數的時候,必須每次從該變數所在的位址所指的記憶體去讀,不能把它放在暫存器或者 cache 中重複訪問,可以保證對特...

C語言中的volatile

關鍵字volatile 有什麼含意 並給出三個不同的例子。乙個定義為volatile 的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是 volatile 變...

C語言中的volatile

volatile是乙個型別 修飾符 type specifier 就像大家更熟悉的const一樣,它是被設計用來修飾被不同執行緒訪問和修改的變數。volatile 的作用是作為指令 關鍵字,確保本條指令不會因 編譯器的優化而省略,且要求每次 每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡...