C++ std::string的默认容量?

C++ std::string的默认容量?,c++,string,std,dynamic-memory-allocation,stdstring,C++,String,Std,Dynamic Memory Allocation,Stdstring,当我使用默认构造函数创建std::string时,堆上是否分配了内存?我希望答案不取决于实施,而是标准化的。考虑以下事项: std::string myString; 不幸的是,根据N3290,答案是否定的 第643页的表63说明: data() size()0 capacity()未指定的值 对于C++03,该表是相同的。它依赖于实现。有些字符串实现会为小字符串使用少量自动分配的存储空间,然后为大字符串动态分配更多存储空间。这取决于编译器。看看这里,有一个很好的解释: 没有,但是,我不知

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

std::string myString;

不幸的是,根据N3290,答案是否定的

第643页的表63说明:

  • data()
  • size()
    0
  • capacity()
    未指定的值

对于C++03,该表是相同的。

它依赖于实现。有些字符串实现会为小字符串使用少量自动分配的存储空间,然后为大字符串动态分配更多存储空间。

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

没有,但是,我不知道有任何实现在默认情况下在堆上分配内存。但是,有相当多的实例包括所谓的短字符串优化(SSO),它们将一些空间分配给字符串对象本身,因此只要不需要超过该长度(通常看起来是10到20个字符),就可以完全避免进行单独的堆分配


不过,这也不是标准化的。

通常,它们在堆上分配内存。我将给出一个示例:
c\u str()
需要一个空尾随字符“\0”。大多数实现将此NUL
\0
作为字符串的一部分提前分配。因此,您将获得至少一个字节的分配,通常更多


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

挑剔:“空终止符”中的“空”指的是ASCII
NUL
字符,它的拼写与空指针
null
不同。在VC++中,小字符串优化应该涵盖这一点。G++使用ref计数:所有空字符串都由相同的静态分配内存块表示。哪些实现实际上涉及空字符串的动态分配?这并不是字面上的ref计数。对带有“\0”的内存的引用根本不计算在内。