【发布时间】:2019-07-11 17:18:25
【问题描述】:
我想知道当您复制容器时,像向量或字符串这样的容器的容量会发生什么变化。我运行了以下实验(Clang 8),不知道会发生什么。
#include <iostream>
#include <vector>
#include <string>
int main()
{
using namespace std;
vector<int> v;
v.reserve(100);
vector<int> v2 = v;
cout << v2.capacity() << endl;
// 0
string s;
s.reserve(100);
string s2 = s;
cout << s2.capacity() << endl;
// 15
return 0;
}
所以看起来容量没有被复制。一方面这似乎是合理的,因为让副本占用不必要的内存是一种浪费。但是,另一方面,我可能预计副本具有相同的容量。也许我确实想制作几个具有一些预分配容量的向量。更一般地说,我通常希望副本的行为类似于复制的对象,粗略地说,在调用 const 方法时返回相同的结果。我知道没有这样的规则,而且标准中肯定有很多情况不会发生这种情况。但无论如何,我想知道是否有任何规范,如果标准明确规定容器的容量不需要跨副本维护。理想情况下,我想获得一些特定的行为,例如假设 clang 所做的事情是正确的(不维持容量),那么我想理所当然地认为容量永远不会被维持(例如“副本的容量是你在shrink_to_fit 之后得到的东西”) ,尽管我认为标准会将其留给编译器。
【问题讨论】:
-
您如何解释引用计数对象?那里也没有复制,但是“复制”了。
-
@PaulMcKenzie 我不明白你的意思。在任何情况下,例如
shared_ptr具有非常明确的复制语义(共享指针本身被复制,存在引用计数器等),这里我不确定在哪里指定应该或不应该将容量复制到新对象。
标签: c++ stl copy-constructor