繁体   English   中英

字符串数组的内存分配

[英]memory allocation for array of strings

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

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

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

每个字符串分配的内存量是否有限? 还是动态分配数组?

不要想太多。 当您说T x[N]; ,则声明一个自动(即局部作用域)数组。 这与仅声明T x1;非常相似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

文字字符串存储在二进制文件的数据段中。

编辑:

ildjarn的评论中的要点。 std :: strings由数组中的副本构造函数创建。 它们的存储位置取决于实现。 一些实现将小型字符串(少于32个字符)内联存储在数组中。 其他的将从std :: allocator分配,通常是从堆malloc分配的。

在这种情况下,编译器会将这些文字放在ELF二进制文件的.data节中。 因此,在这种情况下,它们会在您创建的可执行文件(或库文件)中静态分配。

.data节通常是保留给编译时间常数的,这些时间常数不只是硬编码到汇编指令中。 如您所见,仅将地址保存到字符串中要比将其放置到使用它的地方便宜得多(某些整数和定义的宏可以做到)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM