当我使用默认构造函数创建std::string
时,是否在堆上分配了任何内存?我希望答案不依赖于实施,并且是标准化的。请考虑以下事项:
std::string myString;
答案 0 :(得分:8)
不幸的是,根据N3290,答案是肯定的。
表63第643页说:
data()
一个非空指针,可以复制并且可以添加0 size()
0 capacity()
未指定的值该表与C ++ 03完全相同。
答案 1 :(得分:3)
它取决于实现。一些字符串实现为小字符串使用少量自动分配的存储,然后为更大的字符串动态分配更多。
答案 2 :(得分:3)
不,但是,我不知道默认情况下在堆上分配内存的任何实现。然而,相当多的包括所谓的短字符串优化(SSO),它们将一些空间分配为字符串对象本身的一部分,因此只要您不需要超过该长度(似乎在10之间)它可以避免单独进行堆分配。
尽管如此,这还没有标准化。
答案 3 :(得分:0)
这取决于编译器。看看这里,有一个很好的解释:
http://www.learncpp.com/cpp-tutorial/17-3-stdstring-length-and-capacity/
答案 4 :(得分:-2)
通常,是他们在堆上分配内存。我举一个例子:c_str()
需要一个NULL尾随字符'\ 0'。大多数实现提前分配此NUL \0
,作为字符串的一部分。因此,您将至少分配一个字节,通常更多。
如果你真的需要特定的行为,我建议你自己写一课。缓冲区/字符串类并不难写。