Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can this C++ code be changed or improved with 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();
}

I have seen move semantics applied to constructors, but in this bit of code, I'm wondering if the big struct is copied entirely when returned or not. I'm not even sure it is related to move semantics. Does C++ always copies this kind of data, or is it optimized? Could this code be change or improved?

What about a function that returns a vector or a map? Is that map/vector copied?

like image 272
djofriend Avatar asked Oct 29 '18 14:10

djofriend


1 Answers

You don't need to change anything. What you have right now is the rule of zero. Since both std::map and std::vector are moveable your class automatically gets move operations added to it.

Since return_this is a function local object it will be treated as an rvalue and it will either be moved for you or NRVO will kick in and no move or copy will happen.

Your code will either produce a default construction call for return_this and a move constructor call for data or you will see a single default constructor call for data (NRVO makes return_this and data the same thing).

like image 83
NathanOliver Avatar answered Nov 08 '22 05:11

NathanOliver