在下面的C++代碼中,哪裏分配了?它使用堆,數據,bss還是某種組合?我在Linux/x86平臺上以防有所作爲。有沒有辦法讓g ++編譯器向我展示佈局?C++中的全局對象
#include <string>
#include <iostream>
using namespace std;
string s;
int main()
{
s = "test";
cout << s;
}
在下面的C++代碼中,哪裏分配了?它使用堆,數據,bss還是某種組合?我在Linux/x86平臺上以防有所作爲。有沒有辦法讓g ++編譯器向我展示佈局?C++中的全局對象
#include <string>
#include <iostream>
using namespace std;
string s;
int main()
{
s = "test";
cout << s;
}
C++標準沒有定義編譯器在哪裏把這樣的對象,但在UNIX上是合理的認爲字符串數據是,要麼:
鑑於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).
雖然靜態字符串對象是永遠不會上堆,一個或多個指針,就可能最終會在內存堆指着如果字符串指定文本太大任何(可選)內部緩衝區。再說一次,沒有具體的規則可以說他們不會爲其他目的分配堆內存,或者爲文本內容預分配堆,即使它仍然是空的(但這很愚蠢)。
字符串'object'將在數據段中。
但它會在堆上有一些動態分配(例如,保存實際的字符串字符)。
編輯:正確評論,'字符串'不必使用動態分配。例如,如果字符串很短,它可能會保留在內部。這是依賴於實現的。
您可以檢查對象本身的地址以及它包含的指針,以查看事物的位置。如果你知道你的特定可執行文件的內存映射,你可以告訴哪裏的生命。
更有趣的是你爲什麼想知道。是否有一些潛在的問題需要解決/理解? – 2010-12-09 10:35:44
沒有根本的問題,只是想有一個更好的理解。有了內置類型,我想我可以得到它,但對於類對象,我不清楚默認構造函數會發生什麼,以及內存在哪裏。 – Ravi 2010-12-09 22:17:25