繁体   English   中英

在构造函数成员初始值设定项列表中使用 std::move() 与分配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM