当我使用默认构造函数创建std::string
时,堆上是否分配了内存?我希望答案不依赖于实施,而是标准化的。考虑以下内容:
std::string myString;
不幸的是,根据N3290,答案是否定的。
表63第643页显示:
data()
是一个可复制的非空指针,可以添加0size()
0capacity()
一个未指定的值
该表与C++03相同。
没有,但,而且我不知道有任何实现默认情况下会在堆上分配内存。然而,有相当多的方法包括所谓的短字符串优化(SSO),它们将一些空间作为字符串对象本身的一部分进行分配,因此只要不需要超过这个长度(通常在10到20个字符之间),就可以完全避免进行单独的堆分配。
但这也不是标准化的。
它依赖于实现。一些字符串实现为小字符串使用少量自动分配的存储,然后为大字符串动态分配更多存储。
这取决于编译器。看看这里,有一个很好的解释:
http://www.learncpp.com/cpp-tutorial/17-3-stdstring-length-and-capacity/
通常,yes它们在堆上分配内存。我将举一个例子:c_str()
需要一个NULL尾部字符"\0"。大多数实现提前分配这个NUL