删除元素后,std :: string容量保持不变,那么它是否会占用一些内存?

Gau*_*gal 4 c++

以下代码:

string a = "abc";
cout << a.capacity();
a.erase(a.begin() + 1, a.end());
cout << a.capacity();
Run Code Online (Sandbox Code Playgroud)

...输出:

33
Run Code Online (Sandbox Code Playgroud)

即使我从字符串中删除了一些元素,容量也保持不变.所以我的问题是:

  1. 由于容量,一些内存是否被阻止?如果我没有明确表示reserve()怎么办?

  2. 如果我使用reserve()并且最终没有使用整个容量,我是否在浪费内存?

  3. 如果需要,这个额外的内存(我没有使用)会被分配给其他东西吗?

编辑:假设我有

 string a= "something";
 a = "ab";
Run Code Online (Sandbox Code Playgroud)

现在我知道a不会超过两个字符.所以打电话reserve(2)让记忆不浪费是明智的吗?

m8m*_*ble 6

我先回答你的问题:

  1. 内存属于字符串,但未完全使用.如果您不保留,则无法控制容量.你只知道它足够大.

  2. 正确.

  3. 如1)所述:没有.它属于字符串.没有别的东西可以使用这个记忆.字符串本身可以将其用于其他字符.

有关详细信息,我建议使用文档string::reserve.

最后一句话:如果你没有保留,一切都会正常工作 - 虽然可能会有不必要的缓慢.如果你经常添加几个字符并且字符串必须重新分配很多(就像一个向量),情况就是这样.保留基本上是为了绕过这种情况.


在附录中:调用reserve可以帮助节省内存.如果您调用reserve(n),则可确保字符串具有至少n字符的内部容量.请注意,reserve不需要将容量设置为精确,n也不需要为小容量减少容量n(参见reserve文档).

回到你的例子:如果你打电话,reserve它永远不会造成任何伤害.这是你一般可以做的最好的事情.(如果您有C++ 11功能,我建议shrink_to_fit).

我测试了(较旧的)版本的gcc/ clang在这种情况下,容量a变为精确2.由于我不是100%确定添加的问题是什么,这是我跑的:

auto a = string{"something"};
a = "ab";
cout << a << " " << a.capacity() << endl;
a.reserve(2);
cout << a << " " << a.capacity() << endl;
Run Code Online (Sandbox Code Playgroud)

哪个产生:

ab 9
ab 2
Run Code Online (Sandbox Code Playgroud)

  • @ m8mble:我认为在2017年可以假设 - 除非另有说明 - 用c ++标记的问题(有意或无意地)至少引用c ++ 11(MSVC++用户有点危险的假设). (3认同)
  • +1.值得一提的是,[`shrink_to_fit`](http://en.cppreference.com/w/cpp/string/basic_string/shrink_to_fit)可以用来尝试释放一些内存. (2认同)