什么时候std :: string重新分配内存?

时间:2014-09-22 12:26:00

标签: c++ stdstring

当使用std::string对象并且我想为它添加字符时,它会预先分配一些内存,还是只分配我需要的内容?

确切地说:

 std::string s;
 s.reserve(20);
 char c = 'a';
 s = "";
 for(int i = 0; i < 25; i++)
    s += c;

在上面的示例中,我保留了一定量的内存。现在当我清除字符串时,是否会导致保留的内存被丢弃? 在循环中,它会填满保留的内存,然后每次重新分配额外的5个字符吗?

3 个答案:

答案 0 :(得分:4)

当您为其分配空字符串时,不要求std::string释放已分配的内存。当你为它分配一个短字符串时也是如此。唯一的要求是,当它分配内存以容纳更大的字符串时,必须以实现分摊的常量时间的方式完成分配。一个简单的实现是每次需要更多空间时增长2倍。

如果希望最小化字符串的容量,可以在C ++ 11中使用string::shrink_to_fit()。在C ++ 11之前,有些人在需要减少容量时采用了“交换技巧”。

答案 1 :(得分:1)

string不记得&#34;你说了20个字符,它只知道它的当前容量。因此,reserve(20)通话会将容量增加到至少20,并且没有进一步的效果。

当您向字符串添加25个字符时,容量会增加至少25个字符。然后它会保持在这个新的水平,除非你做了一些减少容量的事情。调用clear()不会改变容量。

答案 2 :(得分:0)

不,reserve d内存不被丢弃,swap有一个空对象。

是的,当您的reserve空间已满时,下一个append将导致重新分配。