cppRVO与返回值优化
内容简介
RVO 是 Return Value Optimization,返回值优化。它允许编译器把函数返回对象直接构造到调用方的位置,减少临时对象、拷贝和移动。
C++17 起,某些返回临时对象的场景属于强制消除拷贝,不只是“优化建议”。
常见写法
#include <string>
std::string make_name()
{
return std::string("Alice");
}调用方接收时,对象通常直接构造在目标位置。
NRVO
NRVO 是 Named Return Value Optimization,命名返回值优化。
#include <string>
std::string make_name()
{
std::string name = "Alice";
return name;
}name 是有名字的局部对象,编译器通常也能优化掉拷贝或移动。
最佳代码实践
- 返回局部对象时直接
return obj;。 - 不要为了“优化”写
return std::move(obj);。 - 让类型支持合理的移动构造,但不要依赖移动弥补糟糕的所有权设计。
易错点
std::string make_name()
{
std::string name = "Alice";
return std::move(name); // 不推荐:可能影响 NRVO
}这里 std::move 可能让编译器不能做 NRVO,反而退化成移动。
注意事项
- RVO 解释的是“为什么返回大对象不一定慢”。
- RVO 不等于所有拷贝都会消失。
- 是否发生 NRVO 仍可能受编译器、代码结构和优化级别影响。