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”指的是 ASCIINUL
字符,其拼写与空指针 NULL
不同。
在 VC++ 中,这应该被小字符串优化所覆盖。 G++ 使用引用计数:所有空字符串都由同一块静态分配的内存表示。哪些实现确实涉及空字符串的动态分配?
这不是字面上的引用计数。使用 '\0' 对该内存的引用根本不计算在内。以上是关于std::string 的默认容量?的主要内容,如果未能解决你的问题,请参考以下文章