【发布时间】:2019-06-14 12:51:03
【问题描述】:
代码
#include <iostream>
#include <vector>
class Dummy {
public:
Dummy(int size=5) {array.reserve(size);};
size_t capacity(){return array.capacity();};
private:
std::vector<unsigned long long> array;
};
int main(int argc, char* argv[]){
Dummy test1(10);
Dummy test2(10);
std::cout << "Initial capacity test1: " << test1.capacity() << std::endl;
std::cout << "Initial capacity test2: " << test2.capacity() << std::endl;
Dummy foo(test1);
std::cout << "After copy capacity: " << foo.capacity() << std::endl;
Dummy bar(std::move(test2));
std::cout << "After move capacity: " << bar.capacity() << std::endl;
}
以上是使用 g++ 7.4.0 构建的,并返回以下内容:
初始容量测试1:10
初始容量测试2:10
复制后容量:0
移动后容量:10
问题
为什么移动构造的对象保留了空私有向量的容量,而复制构造的对象却没有?
【问题讨论】:
-
移动一个
std::vector“窃取”原始的内部内存缓冲区,所以它不会改变大小也就不足为奇了。 -
这个例子不需要
Dummy类——你可以用普通的vectors做同样的事情并观察它。移动的全部意义在于避免在“旧”对象不再需要资源的情况下重新创建资源(复制操作必须这样做)。 -
@molbdnilo 我不认为这个论点真的成立,因为复制构造可以用同样的方式来描述,但是 确实 改变了容量。容量不被视为
vector的“价值”的一部分 - 它不是显着属性。
标签: c++