IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++之RVO返回值优化 -> 正文阅读

[C++知识库]C++之RVO返回值优化

什么是RVO优化

RVO的全称是Return Value Optimization。RVO是一种编译器优化技术,可以把通过函数返回创建的临时对象给”去掉”,然后可以达到少调用拷贝构造的操作目的,
它是C++11标准的一部分。

如果编译器明确知道函数会返回哪一个局部对象,那么编译器会把存储这个局部对象的地址和存储返回值临时对象的地址进行复用,也就是说避免了从局部对象到临时对象的拷贝操作。这就是RVO。

main.cpp
#include <iostream>
using namespace std;
class A {
public:
    A() {
        cout << "构造函数" << endl;
    }

    A(const A &a) {
        cout << "拷贝构造函数" << endl;
    }

    ~A() {
        cout << "析构函数" << endl;
    }

};

A getA() {
    A a;
    return a;
}

int main() {
    A b = getA();
    return 0;
}

以上程序如果在C++11下编译,并且没有关闭RVO优化的话一般只会输出:

构造函数
析构函数

也就是仅仅发生了一次构造,连拷贝构造都没有发生,这就是编译器RVO优化所做的事情。

我们试下如果不使用RVO优化的话会是怎样的一个过程呢?对于以上程序我们用g++命令禁用掉RVO优化编译g++ main.cpp -o main -fno-elide-constructors,然后运行可执行文件main会发现输出如下:

构造函数
拷贝构造函数
析构函数
拷贝构造函数
析构函数
析构函数

天呐,我们发现一个简单的函数调用居然发生了三次构造,分别是一次普通构造和两次拷贝构造。首先在函数getA内部发生了一次普通的构造,然后在函数getA返回时将局部变量a拷贝给了函数getA的返回值作为临时变量,这里发生了第一次拷贝。
最后在函数main中将函数getA中返回的临时变量通过拷贝构造生成变量b,这里产生了第二次拷贝。

RVO诞生之前

通过对比我们发现RVO的存在实实在在的提高了我们程序的性能。那么在RVO诞生之前,程序员们一般是通过怎么方式减少拷贝呢?可以通过引用传参数的方式减少临时变量的拷贝,
也就是将你想要的结果的引用作为函数的参数传递到函数中去,然后在函数中给结果引用赋值,伪代码:

void getA(A &result) {
    A temp;
    result = temp;
}

在这里想说的是,新标准的诞生总是带着解决某个问题的目的而来,随着新标准的普及,我们应该紧跟发展的脚步,虽不能说做到形影不离,但也不能让自己落后得太远。

NRVO

NRVO其实就是RVO的一个变种或者是优化,理解了RVO也就理解了NRVO。。。

资料

更多资料可以参考 《More Effective C++》

条款 20:协助完成“返回值优化(RVO)”

关注我,一起进步,人生不止coding!!!
公粽号:思想觉悟

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:20:07  更:2022-03-22 20:21:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:17:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码