2011-02-18 82 views
0

我明白,函數不應該返回對自動變量的引用。 但是我只是想了解常量對象的存儲位置,即它是否與靜態全局變量一起存儲在內存段中。const對象存儲在哪裏

這是Visual Studio 8上的代碼。它看起來像const對象存儲爲自動變量。我是否假設事情是正確的?或者是具體實現還是取決於構造函數是否微不足道?

如果有人能夠解釋爲什麼每個案例的行爲方式都是如此,那將會非常棒。

//here i'm intentionally returning a ptr to local const ptr hope the syntax is right 

const char* const* get_const_char_ptr() { 
    const char * const ptr = "downontheupside"; 
    return &ptr; 
} 

const int& get_const_int() {   
    const int magic_number = 20; 
    return magic_number; 
} 

const string& get_const_string() {  
    const string str("superunknown"); 
    return str; 
} 

const string* get_const_string_ptr() { 
    const string str("louderthanlove"); 
    return &str; 
} 

int main() { 
    //case1 
    const int &i = get_const_int(); 
    cout<<"case1:"<<i<<endl; 

    //case 2 
    const char * const* c =get_const_char_ptr(); 
    cout<<"case2:"<<*c<<endl; 

    //case3 
    const string &str = get_const_string(); 
    //this crashes 
    //cout<<"case3:"<<str<<endl; 

    return 1; 
} 
+1

wha ...沒有badmotorfinger?!? – justin 2011-02-18 05:07:00

+0

不知道我是如何錯過:) – keety 2011-02-18 22:11:51

回答

2

函數中分配的常量對象就像任何其他自動變量一樣;他們只有const類型。全局(和類靜態)變量略有不同:一些常量可以放在可執行文件的只讀部分,然後只複製到內存中。這是用於像字符串和整數常量的東西;我不相信它用於任何具有不平凡構造函數的東西。

6

const不會改變事物的存儲位置,它是一個關鍵字,告訴編譯器防止變量或函數修改內容。例如:

std::string myNormalStr("Hello"); 
const std::string myConstStr("Don't Change Me"); 

myNormalStr = myConstStr; // this is ok 
myConstStr = myNormalStr; // this will give you a compile error 

這是一個超級簡單的例子,但同樣適用於被傳遞到功能const對象,從函數返回,或者如果函數本身是const

以下是a great article by Herb Sutter關於使用const關鍵字的所有正確方法。

編輯:

目前還幾乎沒有理由使用auto關鍵字作爲一切都隱含汽車內它的範圍。此關鍵字是自動變量的存儲類說明符。

但是auto關鍵字正在改變,作爲正在進行的新C++標準的一部分,但Visual Studio 2010和其他一些新的光榮形式的編譯器已經支持該關鍵字。它可以像這樣在C++中使用0x:

std::vector<int> numbers; 
for (std::vector<int>::const_iterator itr(numbers.begin()); 
    itr != numbers.end(); ++itr) 
{ 
     // do something with each iterated element 
} 

// compiler auto deduces from rvalue 
// and determines that you want a 
// std::vector<int>::const_iterator type 
for (auto itr = numbers.cbegin(); 
     itr != numbers.cend(); ++itr) 
{ 
     // do something with each iterated element 
} 
1

關於存儲內容的一切都是特定於實現的。永遠別忘了。有了這個警告,這裏有一些典型的規則。

自動變量既可以存儲在堆棧中,也可以存儲在寄存器中。如果它們是const或不是無關緊要。

靜態變量存儲在程序存儲器中。程序存儲器可能有多個塊,有些是隻讀的,有些則不是。聲明變量const可能會影響存儲哪些塊。

分配了new的變量將位於堆上。如果它是常量或不是很重要。