std :: string的默认容量?

时间:2012-01-31 00:10:33

标签: c++ string std dynamic-memory-allocation stdstring

当我使用默认构造函数创建std::string时,是否在堆上分配了任何内存?我希望答案不依赖于实施,并且是标准化的。请考虑以下事项:

std::string myString;

5 个答案:

答案 0 :(得分:8)

不幸的是,根据N3290,答案是肯定的。

表63第643页说:

  • data()一个非空指针,可以复制并且可以添加0
  • size() 0
  • capacity()未指定的值

该表与C ++ 03完全相同。

答案 1 :(得分:3)

它取决于实现。一些字符串实现为小字符串使用少量自动分配的存储,然后为更大的字符串动态分配更多。

答案 2 :(得分:3)

不,但是,我不知道默认情况下在堆上分配内存的任何实现。然而,相当多的包括所谓的短字符串优化(SSO),它们将一些空间分配为字符串对象本身的一部分,因此只要您不需要超过该长度(似乎在10之间)它可以避免单独进行堆分配。

尽管如此,这还没有标准化。

答案 3 :(得分:0)

这取决于编译器。看看这里,有一个很好的解释:

http://www.learncpp.com/cpp-tutorial/17-3-stdstring-length-and-capacity/

答案 4 :(得分:-2)

通常,他们在堆上分配内存。我举一个例子:c_str()需要一个NULL尾随字符'\ 0'。大多数实现提前分配此NUL \0,作为字符串的一部分。因此,您将至少分配一个字节,通常更多。

如果你真的需要特定的行为,我建议你自己写一课。缓冲区/字符串类并不难写。