代码之家  ›  专栏  ›  技术社区  ›  ELEC

利用C语言中的移动语义++

  •  1
  • ELEC  · 技术社区  · 8 年前

    create() 未转移到局部变量 master_data 在主要功能中?

    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;
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   gsamaras a Data Head    8 年前

    在这里:

    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)) {}
    

    最后,但并非最不重要的一点是,您应该这样修改您的create函数(否则您将得到一个关于无法绑定的编译错误):

    Master create() {
        ...
        return {std::move(data_a), std::move(data_b)};
    }
    
        2
  •  0
  •   Akira    8 年前

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

    接受 a b

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

    但在这种情况下,你必须指出 data_a data_b 内部 create() 功能可以移动:

    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) };
    }
    
    推荐文章