文章

复习: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 进行授权