C++中的const關鍵字和volatile關鍵字

C中的const關鍵字默認是外部連接的,而C++中則是內部連接的,C++中並不給const常量分配存儲,而是將它放到一個符號表中。如果const修飾的標識符在編譯期間值未知,那麼就意味着需要存儲空間,也就是說在需要const變量地址的時候,也就是需要分配存儲的時候。
   Const也可以定義集合,編譯器不能將集合放到符號表中,所以必須分配內存。然而,其值在編譯時不能被使用,因爲編譯器在編譯時不需要知道存儲的內容。不能夠定義一個未知長度的數組。如:
   Const int i[]={1,2,3,4}。
 
   Const修飾的指針格式const int * x和int const * x表達的是同一個意思,x是一個指向const的int普通指針。要想使指針成爲一個const,必須將const放到*的右邊。如int* const x表示指向int的const指針。
 
  有時候在求表達式值期間,編譯器必須建立臨時對象。像其他任何對象一樣,他們需要存儲空間而且必須被構造和刪除。區別是我們從來看不到它們-----編譯器負責它們的去留以及它們存在的細節。它們自動成爲常量。
   可以在一個聲明爲const的函數中改變變量的值,這需要對this指針進行強制類型轉換,或者在類聲明中用mutable關鍵字指明變量是可以在const函數中改變的。如:
   void Y::f() const{
     ((Y*)this)->j++;
   }
 
或者
class Y{
 int I;
 mutable int j;
}
void Y::f() const {j++;}
 
volatile的語法與const一樣,但是volatile的意思是“在編譯器認識的範圍外,這個數據可以被改變”。它告訴編譯器不要擅自做出有關數據的任何假定---在優化期間這是特別重要的。如果編譯器說,已經把數據讀進寄存器,而且再沒有與寄存器接觸。一般情況下,它不需要再讀這個數據,但是如果數據是被volatile修飾的,編譯器就不能做出這樣假定,因爲可能被其他進程改變了,它必須重讀這個數據而不是優化這個代碼。
發佈了16 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章