std::string的默认容量是多少?

10

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

std::string myString;
5个回答

9

很遗憾,根据N3290的规定,答案是否定的。

第643页的第63个表格如下:

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

C ++ 03的表格完全相同。


5

不,但我不知道任何默认在堆上分配内存的实现。然而,很多实现包括所谓的短字符串优化(SSO),他们在字符串对象本身分配一些空间,只要你不需要超过那个长度(通常在10到20个字符之间),就可以避免进行单独的堆分配。

不过这也没有标准化。


3

这取决于具体实现。一些字符串实现会为小型字符串分配少量的自动存储空间,而对于更大的字符串则会动态分配更多的存储空间。


0

-2
通常情况下,它们会在堆上分配内存。我来举个例子:c_str()需要一个空结尾字符'\0'。大多数实现都会提前分配这个NUL \0作为字符串的一部分。因此,你至少会得到一个字节的分配,通常还会有更多。
如果你真的需要特定的行为,我建议你编写自己的类。缓冲区/字符串类并不难编写。

挑剔一点:在“null terminator”中的“null”指的是ASCII NUL字符,拼写方式不同于空指针 NULL - Spire
在VC++中,这应该由小字符串优化来处理。G++使用引用计数:所有空字符串都由相同的静态分配内存块表示。哪些实现实际上涉及对空字符串进行动态分配? - visitor
这与引用计数无关。对于带有 '\0' 的内存的引用根本不计算。 - velkyel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接