可以使用移动语义更改或改进此C++代码吗?

djo*_*end 10 c++ move compiler-optimization move-semantics

struct big_struct{
    vector<int> a_vector;
    map<string, int> a_map;
};

big_struct make_data(){
    big_struct return_this;
    // do stuff, build that data, etc
    return return_this;
}
int main(){

    auto data = make_data();
}
Run Code Online (Sandbox Code Playgroud)

我已经看到移动语义应用于构造函数,但在这段代码中,我想知道大结构是否在返回时完全复制.我甚至不确定它与移动语义有关.C++总是复制这种数据,还是优化?这段代码可以改变或改进吗?

返回矢量或地图的函数怎么样?这张地图/矢量被复制了吗?

Nat*_*ica 12

你不需要改变任何东西.你现在拥有的是零规则.由于这两个std::mapstd::vector可移动,你的类自动获得移动业务加入到它.

由于它return_this是一个函数本地对象,它将被视为一个右值,它将被移动给您或NRVO将启动并且不会发生移动或复制.

您的代码将生成默认构造调用return_this和移动构造函数调用,data或者您将看到一个默认构造函数调用data(NRVO make return_thisdata相同的东西).