[英]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上,認為字符串數據可以是:
鑒於實現並且未定義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.