volatile可以理解為「編譯器警告指示字」
volatile告訴編譯器必須每次去記憶體中取變數值
volatile主要修飾可能被多個執行緒訪問的變數
volatile也可以修飾可能被未知因數更改的變數
如:
int obj = 0 ;
int a = 0 ;
int a = 0 ;
a = obj ;
sleep (100 );
b = obj ;
編譯器在編譯的時候發現obj沒有被當成左值使用,因此會「聰明」的直接將obj替換成10,而把a和b都賦值為10。
編譯器一般情況下回自動幫助我們優化**,幫助我們提公升程式效率。但是在某些特殊情況下,某些變數會被編譯器想象之外的力量所改變,此時如果編譯器沒有意識到而去優化就會造成優化錯誤,優化錯誤就會帶來執行錯誤,而且這種錯誤很難被發現。
volatile字面意思:可變的,易變的。就是告訴編譯器該變數可以被當前**之外的東西改變。而當我們使用了volatile關鍵字後,編譯器將不會對該變數的訪問進行優化
1.中斷isr中引用的變數
2.多執行緒中共用的變數
3.硬體會更改的變數
linux volatile型別限定符
背景 一直會有意無意的看到有這個volatile,但是做為乙個在linux應用層寫了幾年 的程式設計師,還真的沒有搞懂什麼時候需要這樣用?查了一圈,網上都是各種告訴編譯器不要把該變數放到暫存器,放到暫存器,如果其它地方改了拿不到最新的值,不要優化等等 首先說下,組合語言真的屬於基本不會那種。多執行緒...
ANSIC型別限定符
以const型別關鍵字宣告的物件,其值不能通過賦值來遞增,遞減來修改。以下 const int a 12 限定a的值不能修改 a 12 不可以編譯器會報錯,但是可以初始化變數,因此下面的 沒問題 const int a 12 沒問題該宣告讓a成為唯讀變數。初始化後,就不能改變它的值。可以用const...
C C volatile型別限定符
volatile 限定符告知計算機,而不是變數所在的程式 可以改變該變數的值。通常,它被用於硬體位址以及在其他程式或同時執行的執行緒中共享資料。例如,乙個位址上可能儲存著當前的時鐘時間,無論程式做什 麼,位址上的值都隨時間的變化而改變。或者乙個位址用於接受另一台計算 機傳入的資訊。volatile的...