2017-07-09 76 views
1

我有一個問題,我想在單個容器類中存儲結構向量。利用C++中的移動語義

問題是,當爲這些向量創建這個容器時,我浪費資源,因爲向量被複制;沒有移動。爲什麼臨時返回的資源create()沒有轉移到主函數中的局部變量master_data

我假定將工作

示例代碼被呈現以下(並且在coliru HERE):

#include <stdio.h> 
#include <vector> 
#include <stdlib.h> 

// Specific data struct 
typedef struct DataA { 
    DataA(): a(rand()), 
      b(rand()) {} 
    int a,b;  
} DataA; 

// Another specific data struct 
typedef struct DataB { 
    DataB(): c(rand()), 
      d(rand()) {} 
    int c,d; 
} DataB; 

// Container of all relevant data 
typedef struct Master { 
    Master(const std::vector<DataA> &a, const std::vector<DataB> &b) : data_a(std::move(a)), data_b(std::move(b)) {} 
    Master(const Master &rhs) : data_a(std::move(rhs.data_a)), data_b(std::move(rhs.data_b)) {} 

    std::vector<DataA> data_a; 
    std::vector<DataB> data_b; 
} Master; 


Master create() { 
    std::vector<DataA> data_a(10); 
    std::vector<DataB> data_b(10); 

    printf("data_a address inside create() : %p\n", (void*)data_a.data()); 
    printf("data_b address inside create() : %p\n", (void*)data_b.data()); 

    return {data_a, data_b}; 
} 


int main() 
{ 
    Master master_data(create()); 

    printf("data_a address outside create() : %p\n", (void*)master_data.data_a.data()); 
    printf("data_b address outside create() : %p\n", (void*)master_data.data_b.data()); 
    return 0; 
} 
+1

的概念被稱爲「移動**語義**「,而不是」移動原理圖「。 –

+0

__Paste__你想問的代碼,不要鏈接到它們。還提供[mcve]和明確的問題陳述。 「這有用嗎?」並不是一個明確的問題陳述,「行x是否具有Y的時間複雜性?」是。 –

+0

@PserserBy:我做了編輯改進問題。 – ELEC

回答

1

這裏:

Master(const Master &rhs) : data_a(std::move(rhs.data_a)), data_b(std::move(rhs.data_b)) {} 

的參數是恆定,這防止它們被移動,因爲它們是不可變的。

嘗試使用這樣的事情,而不是:

Master(Master&& rhs) : data_a(std::move(rhs.data_a)), data_b(std::move(rhs.data_b)) {} 

在那裏我放棄了const&&增強您的參數。

同樣的構造,你會怎麼做:

Master(std::vector<DataA>&& a, std::vector<DataB>&& b) : data_a(std::move(a)), data_b(std::move(b)) {} 

最後,但並非最不重要的,你應該修改你的創造功能,像這樣(否則你將得到有關無法綁定編譯錯誤):

Master create() { 
    ... 
    return {std::move(data_a), std::move(data_b)}; 
} 
0

你的構造:

Master(const std::vector<DataA> &a, const std::vector<DataB> &b); 

接受ab參數作爲常量引用。你必須定義它接受右值引用如下:

Master(std::vector<DataA>&& a, std::vector<DataB>&& b); 

但在這種情況下,你必須表明data_adata_bcreate()函數內可以移動:

Master create() { 
    std::vector<DataA> data_a(10); 
    std::vector<DataB> data_b(10); 

    printf("data_a address inside create() : %p\n", (void*)data_a.data()); 
    printf("data_b address inside create() : %p\n", (void*)data_b.data()); 

    return { std::move(data_a), std::move(data_b) }; 
}