字符串数组的内存分配

时间:2011-10-05 20:19:14

标签: c++ string memory-management

据我所知,数组是静态分配的,但字符串是动态的,因为它们的长度在运行时经常会发生变化。

当我定义这样的数组时会发生什么:

std::string array[] = {"abc", "defghi", "jk", "lmnop", "qrstuvwxyz"};

是否为每个字符串分配了有限的内存?或者是动态分配的数组?

3 个答案:

答案 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部分通常保留用于编译时常量,这些常量不仅仅是硬编码到汇编指令中。正如您所看到的那样,简单地将地址保存到字符串比将它放在任何地方都要便宜得多(正如一些整数和定义的宏所做的那样)。