复习:RVO NRVO and std::move
RVO 以及 NRVO
- RVO:返回值优化,其功能为:消除子函数返回的
临时对象
导致的拷贝构造。 - NRVO:其功能为:消除子函数中返回的
局部对象
导致的拷贝构造。
1
2
3
4
5
6
7
8
9
10
11
12
class Object {
//...
};
Object getObjRVO() {
return Object(); // RVO
}
Object getObjNRVO() {
Object localObj;
return localObj; // NRVO
}
std::move
使用场景:
- 局部对象赋值给长生命周期对象时,使用
std::move
。前提是该类里面有非trival
成员,如std::string
,或支持移动构造的自定义类成员; std::vector
等容器使用emplace_back
代替push_back
,此时针对局部对象使用std::move
+emplace_back
可以避免拷贝构造 – 代之以移动构造;std::thread
线程不可复制,只能所有权转移。如将线程对象添加到std::vector
中,则需要使用std::move
转移所有权。
不要使用std::move
:
- 对于返回值优化的函数,不要使用
std::move
。
本文由作者按照 CC BY 4.0 进行授权