C++ RVO 或 NRVO 可能触发的条件
1. NRVO(Named RVO) —— 命名返回值优化
MyClass create() {
MyClass obj(10);
// ... 处理
return obj; // NRVO 可能发生
}
触发条件:
- obj 的类型与函数返回类型相同(或可隐式转换)
- 函数只有一个返回路径(或多条路径返回同一个变量)
- 编译器认为安全且可优化
- ⚠️ NRVO 不保证被应用,是“可选优化”。
2. RVO(匿名对象) —— 直接返回临时对象
MyClass create() {
return MyClass(42); // 返回临时对象
}
或者
return {}; // 使用聚合初始化
- 返回类成员变量通常不会触发
- 多返回路径,若不同路径返的不是同一对象,可能不会触发。
C++17 起:保证 RVO(Guaranteed Copy Elision)
从 C++17 开始,这种情况下必须省略拷贝/移动,称为“强制返回值优化”。
浙公网安备 33010602011771号