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会发现输出如下:

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

天呐,我们发现一个简单的函数调用居然发生了三次构造,分别是

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值