以下代码:
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)
即使我从字符串中删除了一些元素,容量也保持不变.所以我的问题是:
由于容量,一些内存是否被阻止?如果我没有明确表示reserve()怎么办?
如果我使用reserve()并且最终没有使用整个容量,我是否在浪费内存?
如果需要,这个额外的内存(我没有使用)会被分配给其他东西吗?
编辑:假设我有
string a= "something";
a = "ab";
Run Code Online (Sandbox Code Playgroud)
现在我知道a不会超过两个字符.所以打电话reserve(2)让记忆不浪费是明智的吗?
我先回答你的问题:
内存属于字符串,但未完全使用.如果您不保留,则无法控制容量.你只知道它足够大.
正确.
如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)
| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |