簡體   English   中英

C ++中的全局對象

[英]global objects in C++

在以下C ++代碼中,s分配在哪里? 它是使用堆,數據,bss還是某種組合? 我在Linux / x86平台上,以防萬一。 有沒有辦法讓g ++編譯器向我展示布局?

#include <string>
#include <iostream>

using namespace std;

string s;

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

字符串'object'將位於數據段中。

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

編輯:正確評論,'字符串'不必使用動態分配。 例如,如果字符串很短,則可以保留在內部。 這取決於實現。

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

C ++標准沒有定義編譯器放置這些對象的位置,但在UNIX上,認為字符串數據可以是:

  • 在BSS上,默認構造函數在main()之前運行
  • 在BSS上,編譯器確定即使默認構造函數運行,所有成員都將為0,因此根本不運行構造函數
  • 在數據段中,默認構造函數在main()之前運行
  • 在數據段中,成員變量的初始值由編譯器計算並直接寫入二進制圖像

鑒於實現並且未定義std :: string的成員,通常不清楚任何成員在默認初始化之后是否應該最終為非0,這就是為什么有這么多可能性的原因。

在使用GCC的Linux上編譯並且沒有優化,然后用“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).

雖然靜態字符串對象永遠不會在堆上,但如果為字符串分配的文本對於任何(可選)內部緩沖區而言太大,它們包含的一個或多個指針最終可能會指向堆上的內存。 同樣,沒有具體的規則可以說他們不會為其他目的分配堆內存,或者為文本內容預先分配堆,即使仍然是空的(但那將是非常愚蠢的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM