![](/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.