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 仍可能受编译器、代码结构和优化级别影响。

相关:移动语义cpp拷贝构造函数调用时机cpp对象生命周期