![](/img/trans.png)
[英]std::list<std::unique_ptr>: empty initializer list vs. default constructor
[英]Using std::move() vs. assign in constructor member initializer list
在参数化构造函数(带有初始化列表)中使用 std::move() 而不是常规成员初始化,即赋值有什么好处?
例如,
#include <iostream>
#include <vector>
template <typename V>
class myVec{
private:
std::vector< std::vector<V> > vec;
public:
myVec1(const std::vector< std::vector<V> > &myArr):vec(myArr) {};
myVec2(const std::vector< std::vector<V> > &myArr):vec(std::move(myArr)) {};
};
使用 myVec1 而不是另一个会获得多少优势(内存、性能等)?
在您的情况下,性能的变化为零,因为这两种情况下的输入都是const
通常,通过正确使用移动构造函数,收益会很大,因为不会有任何不必要的复制和分配 - 每个std::vector
实例一个。
在这种情况下没有性能差异。
std::move(myArr)
将产生一个对 myArr 的 const 右值引用。 现在,由于 myArr 不可修改,因此将 this 绑定到右值引用是无效的,但它可以绑定到 const 左值引用。 因此vec(std::move(myArr))
最终将调用vector
的复制构造函数。
你想要的是:
myVec(const std::vector< std::vector<V> > &myArr):vec(myArr) {}; // 1
myVec(std::vector< std::vector<V> > &&myArr):vec(std::move(myArr)) {}; // 2
现在回到你最初的问题,假设你有上面的构造函数。 如果您正在使用 move-ctor(2),您显然可以节省大量副本。 请注意,在这里您正在从原始向量中moving
数据的所有权,因此请记住您的用例。
有多大优势
我只想说很多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.