使用 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
我会说很多。
在参数化构造函数(带有初始化列表)中使用 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
我会说很多。