一篇文章帶你瞭解C語言中volatile關鍵字
C語言中volatile關鍵字
volatile關鍵字是C語言中非常冷門的關鍵字,因為用到這個關鍵字的場景並不多。
當不用這個關鍵字的時候,CPU可能會對我們的代碼做一定的優化:
內存中的數據要放入CPU中進行運算或控制,而這個數據的值是被放入寄存器中,然後再將寄存器中的數據進行運算或控制的,對於一個死循環int flag=1;while(flag);
來說;如果進行優化,則下次循環則不需要再次將flag內存中的值放入寄存器中,而是直接使用寄存器中已有的值進行循環;如果不進行優化,則下次還需要將flag內存中的值放入寄存器中,然後使用寄存器中的數據。
總結起來就是,遇到這個關鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進行優化,從而可以提供對其地址的穩定訪問;如果不使用valatile,則編譯器將對所聲明的語句進行優化。
這兩種情況在單線程的情況下區別不大,但是在多線程的情況下可能會有其他邏輯將flag修改為0,如果進行優化,則死循環不會停下來。
所以volatile的作用就是讓變量不要被CPU優化,達到穩定訪問內存的目的。
比如下面的代碼:
我們在gcc下使用命令gcc test.c -O2 -g將代碼進行優化,然後用命令objdump -S -d a.out > a.s將優化後的匯編代碼放入a.s文件中,再用vim a.s查看a.s文件:
程序會一直在這一句代碼中死循環:
加入volatile後:
再用相同的命令查看a.s文件:
可以看到每次循環都會讀取pass的數據。
結論: volatile 忽略編譯器的優化,保持內存可見性。
另外,const和volatile是不沖突的:
const volatile int a = 10;
const關鍵字要求變量a不能直接被寫入,而volatile關鍵字要求每次讀取數據的時候,都要從a所在的內存中讀取,並不會改變變量a的值。
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- C語言中volatile關鍵字的作用與使用案例教程
- Java並發編程之Volatile變量詳解分析
- Java Synchronize下的volatile關鍵字詳解
- java 中的volatile關鍵字
- Java中Volatile關鍵字能保證原子性嗎