2012-07-27 18 views
2

考慮下面的代碼片段:獲取甚至通過const_cast會改變之後的常量變量的值相同

int main() 
{ 
    const int i=3; 
    int *ptr; 

    ptr=const_cast<int*>(&i); 
    *ptr=5; 

    cout<<"i= "<<i<<endl; <------------------- statement 1 
    cout<<"*ptr= "<<*ptr<<endl; <------------- statement 2 

    return 0; 
} 

我得到的輸出:

i= 3 
*ptr= 5 

http://ideone.com/Bvme6

爲什麼是不是通過指針改變了i的值?

我知道拋棄顯式聲明爲const的變量的常量,並將其值修改爲'未定義行爲'。我很想知道:是否有編譯器優化機制,「編譯器用值'替換程序中的變量? 這意味着該語句1是由編譯器解釋爲:

cout<<"i= "<<3<<endl; 

即使聲明

ptr=const_cast<int*>(&i);  

ptr=(int*)(&i); 

我收到相同的輸出代替:http://ideone.com/5lzJA

+1

如果你想知道編譯器做了什麼,只要看看編譯器做了什麼(即生成的代碼)。 – 2012-07-27 15:21:07

+2

我認爲downvotes是苛刻的 – James 2012-07-27 15:33:23

+1

優化通常被稱爲「不斷傳播」。只要可觀察的行爲是正確的,編譯器就可以做任何事情。行爲是未定義的,所以編譯器會自動修正它所做的任何事情。 – Flexo 2012-07-27 15:42:35

回答

2

編譯器是否使用該值替換程序中的變量的編譯器優化機制?

是的;這就是爲什麼你沒有看到價值的變化。嘗試修改const對象的行爲未定義,以便允許這樣的優化(以及允許將對象放置在不可寫內存中)。

0

最有可能的,因爲它是一個const int,編譯器正在優化並直接用i的值替換它。

0

i可能被存儲在內存的一個保護區域中,指向ptr指向。當然,任何事情都可能是這種情況,這就是爲什麼它是undefined - 這基本上意味着如果您嘗試觸發未定義的行爲,則不依賴於發生的任何特定行爲。你知道這可能會導致你的電腦進入心臟驟停或者開始拍攝激光束,但是你永遠不知道,因爲它是......(w a i t _f o r _ i t)... undefined;)。

1

這不是一個優化。優化是將程序轉換爲具有相同行爲但使用較少資源的另一程序。您的程序沒有任何已定義的行爲,因此您無法對其應用任何轉換,從而產生相同的行爲。

0

我哈德同樣的問題,我加入揮發性的,現在它的修改:

#include<iostream> 
using namespace std; 

int main() 
{ 
    volatile const int a=5; 
    int *p = const_cast<int*>(&a); 
    *p=6; 
    cout<<"a="<<a; 
    return 0; 
} 

輸出:

a=6 

揮發性告訴編譯器,該標識符可以由該代碼由被修改(如果不是那麼一些其他人,所以不要執行任何優化)