C++ RVO 或 NRVO 可能触发的条件

1. NRVO(Named RVO) —— 命名返回值优化

MyClass create() {
    MyClass obj(10);
    // ... 处理
    return obj;  // NRVO 可能发生
}

触发条件:

  1. obj 的类型与函数返回类型相同(或可隐式转换)
  2. 函数只有一个返回路径(或多条路径返回同一个变量)
  3. 编译器认为安全且可优化
  4. ⚠️ NRVO 不保证被应用,是“可选优化”。

2. RVO(匿名对象) —— 直接返回临时对象

MyClass create() {
    return MyClass(42);  // 返回临时对象
}

或者

return {}; // 使用聚合初始化
  • 返回类成员变量通常不会触发
  • 多返回路径,若不同路径返的不是同一对象,可能不会触发。

C++17 起:保证 RVO(Guaranteed Copy Elision)
从 C++17 开始,这种情况下必须省略拷贝/移动,称为“强制返回值优化”。

posted @ 2025-08-14 19:31  double64  阅读(22)  评论(0)    收藏  举报