据我所知,数组是静态分配的,但字符串是动态的,因为它们的长度在运行时经常会发生变化。
当我定义这样的数组时会发生什么:
std::string array[] = {"abc", "defghi", "jk", "lmnop", "qrstuvwxyz"};
?
是否为每个字符串分配了有限的内存?或者是动态分配的数组?
答案 0 :(得分:3)
不要过度思考。当您说T x[N];
时,您声明一个自动(即范围本地)数组。这与仅声明T x1;
,T x2;
,...,T xN;
非常相似。 std::string
的实例在其声明上下文中总是占用相同的小尺寸(例如在堆栈上);它只是它管理的内存(默认情况下在免费商店中)是动态的。
请注意,当您在代码中编写std::string s("Hello");
时,字符串文字(传递给构造函数)当然会存储在程序二进制文件中,并且会被加载到程序存储器中(通常是只读数据段)。因此,如果你真的只需要读取这些字符串(而不是修改它们),那么你也可以只声明一个char指针数组并节省一些内存:
const char * strings[] = { "Hello", "World", "!" }; // just one copy in r/o memory
答案 1 :(得分:2)
Literal字符串存储在二进制文件的data segment中。
编辑:
ildjarn评论中的好点。 std :: strings由数组中的复制构造函数创建。它们存储的位置取决于实现。某些实现在数组中内联存储小字符串(少于32个字符)。其他人将从std :: allocator中分配,这通常是从堆中进行malloc-ed。
答案 2 :(得分:1)
在这种情况下,编译器将这些文字放在ELF二进制文件的.data部分中。因此,在这种情况下,它们会在您创建的可执行文件(或库)文件中静态分配。
.data部分通常保留用于编译时常量,这些常量不仅仅是硬编码到汇编指令中。正如您所看到的那样,简单地将地址保存到字符串比将它放在任何地方都要便宜得多(正如一些整数和定义的宏所做的那样)。