std::string 的默认容量?

Posted

技术标签:

【中文标题】std::string 的默认容量?【英文标题】:Default capacity of std::string? 【发布时间】:2012-02-22 18:24:26 【问题描述】:

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

std::string myString;

【问题讨论】:

【参考方案1】:

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

表 63 第 643 页说:

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

该表与 C++03 相同。

【讨论】:

【参考方案2】:

不,但是,我不知道有什么实现会默认在堆上分配内存。然而,相当多的包括所谓的短字符串优化(SSO),他们在其中分配一些空间作为字符串对象本身的一部分,只要您不需要超过该长度(似乎在 10并且通常为 20 个字符)它可以完全避免进行单独的堆分配。

虽然这也不是标准化的。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

Nitpick:“null terminator”中的“null”指的是 ASCII NUL 字符,其拼写与空指针 NULL 不同。 在 VC++ 中,这应该被小字符串优化所覆盖。 G++ 使用引用计数:所有空字符串都由同一块静态分配的内存表示。哪些实现确实涉及空字符串的动态分配? 这不是字面上的引用计数。使用 '\0' 对该内存的引用根本不计算在内。

以上是关于std::string 的默认容量?的主要内容,如果未能解决你的问题,请参考以下文章

复制分配期间的c ++字符串容量更改

HashMap的初始容量和加载因子

cinder list查看卷的容量,容量默认是啥单位

在 Java 8 中,为啥 ArrayList 的默认容量现在为零?

hashMap记录

ArrayListVectorHashMapHashSet的默认初始容量加载因子扩容增量