一下代碼輸出什麼?優化
const int i = 1; int *j =(int*) &i; *j = 22; cout << &i << " " << j << endl; cout << i << " " << *j << endl;
const變量的地址取值後 發現結果居然不同 既然是同一個地址 爲何會是不一樣的結果,初步認爲是數據存儲區不同的問題,而後進一步發現非也。
設計
既然最初設計爲const 那麼開發者確定不想對這個變量修改 那麼編譯器能夠優化爲 當即數 替 換原來引用 的地方 從而提升效率,以後上面代碼爲code
const int i = 1; int *j =(int*) &i; *j = 22; cout << &i << " " << j << endl; cout << 1 << " " << *j << endl;
volatile 告訴編譯器該變量是隨時可能發生變化的,每次使用它的時候必須從內存中讀取,於是編譯器生成的可執行碼會從新從i的地址讀取數據 內存
volatile 關鍵字能夠 禁止編譯器這種優化行爲開發
可是對於new 這種const 值是沒法肯定的 因此編譯器沒法優化 ,以下例編譯器
int * const i = new int; int *j = (int*)i; *j = 22; cout << i << " " << j << endl; cout << *i << " " << *j;
限制的i的值 運行期才能決定 因此編譯期 編譯器沒法優化,也就不存在那個」疑惑「了
編譯