2010-12-09 149 views
3

在下面的C++代碼中,哪裏分配了?它使用堆,數據,bss還是某種組合?我在Linux/x86平臺上以防有所作爲。有沒有辦法讓g ++編譯器向我展示佈局?C++中的全局對象

#include <string> 
#include <iostream> 

using namespace std; 

string s; 

int main() 
{ 
    s = "test"; 
    cout << s; 
} 
+0

更有趣的是你爲什麼想知道。是否有一些潛在的問題需要解決/理解? – 2010-12-09 10:35:44

+0

沒有根本的問題,只是想有一個更好的理解。有了內置類型,我想我可以得到它,但對於類對象,我不清楚默認構造函數會發生什麼,以及內存在哪裏。 – Ravi 2010-12-09 22:17:25

回答

1

C++標準沒有定義編譯器在哪裏把這樣的對象,但在UNIX上是合理的認爲字符串數據是,要麼:

  • 在BSS,與前主運行默認構造函數()
  • 對於BSS,編譯器確定即使缺省構造函數運行,所有成員都將爲0,因此不會在數據段中全部運行構造函數
  • ,並且默認構造函數在main ()
  • in the數據段,由成員變量的初始值由編譯器計算並直接寫入二進制圖像

鑑於std :: string的實現和成員沒有定義,所以通常不清楚是否有成員應該默認初始化後最終不是0,這就是爲什麼有這麼多的可能性。

使用GCC進行編譯並且沒有優化,然後使用「nm -C」檢查可執行文件,我碰巧在BSS上有's'。

~/dev nm -C bss | grep ' s$' 
08048896 t global constructors keyed to s 
08049c98 B s 

男人納米

... 
     "B" The symbol is in the uninitialized data section (known as 
      BSS). 

雖然靜態字符串對象是永遠不會上堆,一個或多個指針,就可能最終會在內存堆指着如果字符串指定文本太大任何(可選)內部緩衝區。再說一次,沒有具體的規則可以說他們不會爲其他目的分配堆內存,或者爲文本內容預分配堆,即使它仍然是空的(但這很愚蠢)。

1

字符串'object'將在數據段中。

但它會在堆上有一些動態分配(例如,保存實際的字符串字符)。

編輯:正確評論,'字符串'不必使用動態分配。例如,如果字符串很短,它可能會保留在內部。這是依賴於實現的。

您可以檢查對象本身的地址以及它包含的指針,以查看事物的位置。如果你知道你的特定可執行文件的內存映射,你可以告訴哪裏的生命。