为什么移动构造对象保留空私有向量的容量,而复制构造对象却不保留?

时间:2019-06-14 12:51:03

标签: c++

代码

#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

问题

为什么移动构造对象保留了空私有向量的容量,而复制构造对象却没有呢?

1 个答案:

答案 0 :(得分:1)

因为副本是副本。

复制矢量时,它会复制具有元素。不是为将来的元素计划的空白空间。虽然要尽可能快地移动,结果却盲目地移动了所有东西。我个人不会在此计划我的代码。您应该依靠移动移动保留空间,也不要依靠移动在其自身之后留下一个空容器。