可以使用移动语义更改或改进此 C++ 代码吗?
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();
}
我已经看到应用于构造函数的移动语义,但在这段代码中,我想知道返回时是否完全复制了大结构。我什至不确定它与移动语义有关。 C++ 是否总是复制这种数据,还是对其进行了优化?可以更改或改进此代码吗?
returns 矢量或地图的函数怎么样? map/vector 被复制了吗?
您无需更改任何内容。你现在拥有的是rule of zero。由于 std::map
和 std::vector
都是可移动的,因此您的 class 会自动添加移动操作。
由于 return_this
是一个函数局部对象,它将被视为一个右值,它会为您移动或者 NRVO 将启动并且不会发生任何移动或复制。
您的代码将生成对 return_this
的默认构造函数调用和对 data
的移动构造函数调用,或者您将看到对 data
的单个默认构造函数调用(NRVO 使 return_this
和 data
一样。
如前所述here,你的class实际上有一个移动构造函数(隐式生成的),所以它不应该被复制到你的代码中,至少一次(在main
).
一个问题是,您所依赖的是 NRVO,编译器 不需要 来实现它(不像它更简单的兄弟 RVO。 ) 因此,您的结构有机会在 return
语句中被复制,但非常小——但太小了,以至于 return-by-move(如 return std::move(return_this);
)实际上从未被推荐过。如果您的函数中确实有一个 return
语句 return 是一个命名对象,那么实际应用 NRVO 的可能性很高。
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();
}
我已经看到应用于构造函数的移动语义,但在这段代码中,我想知道返回时是否完全复制了大结构。我什至不确定它与移动语义有关。 C++ 是否总是复制这种数据,还是对其进行了优化?可以更改或改进此代码吗?
returns 矢量或地图的函数怎么样? map/vector 被复制了吗?
您无需更改任何内容。你现在拥有的是rule of zero。由于 std::map
和 std::vector
都是可移动的,因此您的 class 会自动添加移动操作。
由于 return_this
是一个函数局部对象,它将被视为一个右值,它会为您移动或者 NRVO 将启动并且不会发生任何移动或复制。
您的代码将生成对 return_this
的默认构造函数调用和对 data
的移动构造函数调用,或者您将看到对 data
的单个默认构造函数调用(NRVO 使 return_this
和 data
一样。
如前所述here,你的class实际上有一个移动构造函数(隐式生成的),所以它不应该被复制到你的代码中,至少一次(在main
).
一个问题是,您所依赖的是 NRVO,编译器 不需要 来实现它(不像它更简单的兄弟 RVO。 ) 因此,您的结构有机会在 return
语句中被复制,但非常小——但太小了,以至于 return-by-move(如 return std::move(return_this);
)实际上从未被推荐过。如果您的函数中确实有一个 return
语句 return 是一个命名对象,那么实际应用 NRVO 的可能性很高。