使用 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 拥有原始向量中数据的所有权,因此请记住您的用例。

How much of an advantage

我会说很多。