簡體   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