2013-09-22 70 views
2

我很想知道初始化成員變量在內存中的位置?即,CSS,BSS,數據段,堆...成員變量駐留在哪個內存段中?

如果我的問題是愚蠢的不要罵我:) 例如

class A 
{ 
    A(); 
    int m_iVar; 
} 

A::A(int i) 
{ 
    m_iVar = i; 
} 

A::A() 
{ 
    m_iVar = 99; 
} 

main() 
{ 
    A o; // => After compilation, the object o, in which segment does it reside? and especially where does "m_iVar" reside 
    A o1(5); // => After compilation here object o1, in which segment does it reside?and especially where does "m_iVar" reside? 

    A *pA = new A; // After compilation, here the memory pointed by pA, I guess it goes to heap, but the variable "m_iVar" where does it reside 
} 
+3

無處。編譯器沒有任何理由爲此生成代碼。 –

+0

相關:http://stackoverflow.com/q/18834568/951890 –

+0

你爲什麼不看看自己? :)查看編譯器生成的彙編指令是一個有趣的練習,並且只要您有調試符號,就可以輕鬆查看所有內容的存儲位置。 –

回答

0

這是相同的任何其他變量。它並沒有在標準中明確說明,但是如果你創建一個本地類實例,它通常會駐留在堆棧上,如果你使用它,它將駐留在免費商店中。成員變量就在您想要的實例內部。靜態類變量可能駐留在其中一個數據段中。

非靜態實例不會駐留在「編譯後」的任何位置,它們會在運行時創建。

0

分類類型的對象與int或任何其他類型的對象相同。非靜態類成員被分配在包含對象內部。

默認情況下,本地對象根據標準具有「自動存儲」,該標準由通常稱爲堆棧的操作環境的一部分實現。無論對象是否明確初始化或如何明確初始化都沒有關係。

使用new根據標準從「自由存儲」分配存儲器,其實現也被稱爲堆。

聲明中使用staticextern或名稱空間範圍聲明的靜態存儲通常由編譯器自行決定的數據段(如css,bss或data)實現。

constexpr對象存在異常,如果沒有使用該對象的地址,則該對象可能僅在編譯時存在,並且沒有任何分配空間。

相關問題