一。volatile定義:多線程
一個定義爲volatile的變量是說這變量可能會被意想不到的被改變,這樣,有了volatile變量後,就提醒編譯器就不會去假設這個變量的值了。精確地說就是,編譯中的優化器在用到這個變量時必須每次都當心地從新讀取這個變量的值,而不是使用保存在寄存器裏的備份。函數
eg:優化
1.硬件設備的寄存器(如:狀態寄存器).net
#define GPFCON (*(volatile unsigned long *)0x56000050)線程
2.一箇中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)指針
3.多線程應用中被幾個任務共享的變量htm
二。const定義:對象
const是一個C語言的關鍵字,它限定一個變量不容許被改變內存
eg:get
1.定義const常量,具備不可變性。
const int i=0; i++將報錯;
2. 能夠保護被修飾的東西,防止意外的修改,加強程序的健壯性。 以下面的例子,若是在函數體內修改了i,編譯器就會報錯;
void function(const int i) { i=10;//error! }
3. 提升了程序執行效率。
編譯器一般不爲普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成爲一個編譯期間的常量,沒有了存儲與讀內存的操做,使得它的效率也很高。
4.能夠避免意義模糊的數字出現,一樣能夠很方便地進行參數的調整和修改。 同宏定義同樣,能夠作到不變則已,一變都變!
const int i=0
若是想修改i的內容,只須要:
const int i=xxxxx;
5.便於進行類型檢查,使編譯器對處理內容有更多瞭解,消除了一些隱患。
void function(const int i) { .........} 編譯器就會知道i是一個常量,不容許修改;
三。volatile和const混用
const和volatile放在一塊兒的意義在於:
(1)本程序段中不能對a做修改,任何修改都是非法的,或者至少是粗心,編譯器應該報錯,防止這種粗心;
(2)另外一個程序段則徹底有可能修改,所以編譯器最好不要作太激進的優化。
「const」含義是「請作爲常量使用」,而並不是「放心吧,那確定是個常量」。
「volatile」的含義是「請不要作沒譜的優化,這個值可能變掉的」,而並不是「你能夠修改這個值」。
所以,它們原本就不是矛盾的。
const修飾的變量不容許這裏修改不表明不容許別處修改,好比:
int i = 5;
const int* p = &i;
i = 6; // 不能夠;
*p = 7; // 徹底能夠,並且那個「const」的「*p」也跟着變成了7。
對於非指針非引用的變量,const volatile同時修飾的意義確實不大。我的以爲。
須要明白「volatile」的含義並不是是「non-const」。因此他們才能夠放在一塊兒。
在C++語言中,const沒有反義詞,若是一個變量沒有const修飾,那它自己就是const的反義詞,而並不是加上volatile纔是const的反義詞。
二者同時修飾一個對象的典型狀況,是用於驅動中訪問外部設備的只讀寄存器。
部分引用:csdn qq306013411網友