c ++最大std :: string长度是由堆栈大小还是堆大小决定的?

时间:2011-04-08 06:29:39

标签: c++ string max

问题中提到的问题。
std :: string myVar;它可以容纳的最大字符是由堆栈还是堆栈决定的?

谢谢

2 个答案:

答案 0 :(得分:8)

默认情况下,为std::string分配的内存是动态分配的。

请注意std::string有一个max_size()函数,返回实现支持的最大字符数。然而,这是有用的,因为它是一个实现最大值,并没有考虑其他资源,如内存。你的真正限制要低得多。 (尝试分配4GB的连续内存,或考虑其他地方的内存耗尽。)

答案 1 :(得分:2)

std::string对象的分配方式与int或任何其他类型必须相同:在堆栈上,如果它是局部变量,或者它可能是static,或者在使用new std::string的堆或new X X包含string等的堆。

但是,std::string对象可能至少包含指向分配器提供的额外内存的指针,basic_string<>实例化 - 对于std::string typedef,这意味着堆分配的内存。直接在原始std::string对象内存或指向堆中,您可以找到:

  • 字符串大小的成员,
  • 可能是某种参考计数器或链接,
  • 字符串存储的文本数据(如果有的话)

某些std::string实现具有“短字符串”优化,它们只将少量字符的字符串直接打包到字符串对象本身中(为了提高内存效率,通常使用某种类型的联合字段用于其他目的)当字符串更长时)。但是,对于其他字符串实现,甚至对于那些在处理太长而不能直接适应std :: string对象的字符串时具有短字符串优化的字符串实现,它们必须遵循对存储的文本数据的指针/引用在分配器提供的(堆)内存中。