前提
多现代?C++ 11 就有了。
问题
我想返回一个对象,但我受到惊吓……
是不是应该从指针型参数返回对象?
结论
已经 C++20 了,请放心,直接,返回对象!
概念
- RVO:Return Value Optimization,返回值优化。
广义的 RVO 分为两种,它们之间的主要区别在于返回值是具名的局部变量还是无名的临时对象。
-
NRVO:Named RVO,具名的返回值优化。这是可选的优化,通常没有多个返回路径返回不同的对象,或者返回的对象不依赖于条件判断时,会被实施。
-
URVO:Unnamed RVO,匿名的返回值优化。通常 RVO 特指 URVO。C++ 17 开始 URVO 必然被实施。
返回的对象会 move 给接收的变量,并且,最多可能优化成直接对接收变量进行构造(NRVO)。
如果明确没有 move 构造函数,则会调用 copy 构造函数,当对象构造代价高时,应该尽量保证有 move 构造函数。
例子
1 | // 传统,不建议,可读性差,使用也不方便 |
避坑
没有必要对返回值再加一次 std::move,因为返回本身就已经是 move,再加一次就是多一次没必要的 move。