在下面的C++代码中,s分配在哪里?它使用堆、数据、bss 还是某种组合?我使用的是 Linux/x86 平台,以防产生影响。有没有办法让 g++ 编译器向我显示布局?
#include <string>
#include <iostream>
using namespace std;
string s;
int main()
{
s = "test";
cout << s;
}
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
man nm
...
"B" The symbol is in the uninitialized data section (known as
BSS).
虽然静态字符串对象永远不在堆上,但如果为字符串分配的文本对于任何(可选)内部缓冲区来说太大,则它们包含的一个或多个指针最终可能会指向堆上的内存。同样,没有具体的规则规定他们不会为其他目的分配堆内存,或者即使堆仍然为空也不会为文本内容预先分配堆内存(但这将是相当愚蠢的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)