天天看點

volatile和const

volatile可了解為“編譯器警告訓示字”

volatile用于告訴編譯器必須每次去記憶體中取變量值

volatile主要修飾可能被多個線程通路的變量

volatile也可以修飾可能被未知因數更改的變量

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的反義詞。

兩者同時修飾一個對象的典型情況,是用于驅動中通路外部裝置的隻讀寄存器。

http://topic.csdn.net/u/20071210/14/321d6ec5-f967-4afb-8d04-b335e6db7b34.html

http://hi.baidu.com/honky/item/b42b278abbb820864414cf83

留一個問題:const volatile int i=10;這行代碼有沒有問題?如果沒有,那 i 到底是什麼 屬性?

回答一:沒有問題,例如隻讀的狀态寄存器。它是volatile,因為它可能被意想不到地改變;它是const,因為程式不應該試圖去修改它。volatile和const并不沖突,隻是控制的範圍不一樣,一個在程式本身之外,另一個是程式本身。

回答二:沒問題,const和volatile這兩個類型限定符不沖突。const表示(運作時)常量語義:被const修飾的對象在所在的作用域無法進行修改操作,編譯器對于試圖直接修改const對象的表達式會産生編譯錯誤。volatile表示“易變的”,即在運作期對象可能在目前程式上下文的控制流以外被修改(例如多線程中被其它線程修改;對象所在的存儲器可能被多個硬體裝置随機修改等情況):被volatile修飾的對象,編譯器不會對這個對象的操作進行優化。一個對象可以同時被const和volatile修飾,表明這個對象展現常量語義,但同時可能被目前對象所在程式上下文意外的情況修改。另外,LS錯誤,const可以修飾左值,修飾的對象本身也可以作為左值(例如數組)。