首页 > 代码库 > 命名的返回值优化(Named Return Value optimization (NRVO))

命名的返回值优化(Named Return Value optimization (NRVO))

命名的返回值优化:

  针对返回一个局部的变量的优化,可以直接用返回的结果对象直接替代局部变量,从而减少了一个复制拷贝,从而提高效率。

 

比如 一个函数如下:

X bar()
{
    X xx;
    // .. 处理xx
    return xx;
}

而在编译器看来则是如下的代码:

  

// 此处的_result是一个在调用该函数时产生的一个临时对象
// , 然后将该对象传入,用以接受结果
void bar(X & __result)
{
    
    X xx;
    
    // 调用xx的构造函数
    xx.X::X();
    
    // .. 处理xx
    
    // 拷贝构造函数
    _result.X::X(xx);
    return;
}

上面是没有采用NRVO优化的,优化后的代码是:

void bar(X & __result)
{
    // 拷贝构造函数,直接用__result替换掉局部变量
    // 从而提高了效率
    __result.X::X();
    
    // ....  对xx的处理,变成了对__result的处理
    
    return;
}

在gcc下写了一个测试:

#include <iostream>
using namespace std;

class Base
{
public:

    Base()
    {
        cout << "构造函数" << endl;
    }

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

Base test()
{
    Base a;
    return a;
}


int main()
{
    test();
    return 0;
}

结果为:

其实结果应该有两个"构造函数"与"析构函数"的输出,因为在test函数中,有一个局部变量的生成,还有一个返回值,应该生成一个对象,然后返回,但是在结果中,我们只看到了一对,所以是采用了NRVO优化的。在《深度探索C++对象模型》这本书中说,需要是copy constructor(拷贝构造函数)才说激活NRVO,但是在这个程序中没有生成copy constructor却也行,所以表示怀疑。