1.95、什么是返回值优化(RVO)?
返回值优化(Return Value Optimization,简称RVO)是C++编译器的一种重要优化技术,目的是消除函数返回对象时产生的临时对象,从而避免不必要的拷贝或移动构造,提高性能。
核心原理
当函数返回一个局部对象时,通常会经历:
- 1. 在函数内部构造局部对象。
- 2. 将该局部对象拷贝或移动到一个临时对象。
- 3. 最终将临时对象拷贝或移动到调用者的目标对象。
RVO通过允许编译器直接在调用者分配的内存空间上构造返回值对象,省略中间的临时对象和相应的拷贝/移动操作,即:
- • 函数内部的局部对象直接构造在调用者的目标对象内存上。
- • 避免了额外的构造和析构调用。
RVO与NRVO
- • RVO(Return Value Optimization):针对返回语句中直接构造的匿名临时对象进行优化。
- • NRVO(Named Return Value Optimization):针对有名字的局部变量返回时的优化,编译器将该局部变量直接构造在调用者的目标对象内存上。
标准与实现
- • C++标准允许编译器省略拷贝构造,即使拷贝构造函数有副作用(如打印日志)。
- • 从C++17开始,某些情况下RVO是强制执行的,拷贝/移动构造会被保证省略。
- • 但是RVO并非在所有场景都生效,多个返回语句、异常处理、拷贝构造有副作用等情况可能阻止优化。
代码示例
struct C {
C() {}
C(const C&) { std::cout << "Copy constructor called\n"; }
};
C f() {
return C(); // 这里的临时对象可直接构造到调用者的内存,省略拷贝
}
int main() {
C obj = f(); // 可能只调用构造函数,不调用拷贝构造
}
影响与意义
- • 减少了函数返回对象时的性能开销,尤其是大对象。
- • 使得按值返回对象成为高效且安全的设计选择。
- • 促进了现代C++代码风格的简洁和表达力。
总结
返回值优化(RVO)是编译器通过直接在调用者内存上构造返回对象,消除临时对象和拷贝/移动构造的优化技术。它显著提升了函数按值返回对象的性能,已成为现代C++编程中不可或缺的优化手段。虽然并非所有场景都能生效,但C++17标准已将部分RVO行为纳入强制执行范围,进一步保证了优化效果。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
个人教程网站内容更丰富:(https://www.1217zy.vip/)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1915
文章版权归作者所有,未经允许请勿转载。
THE END