码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-05-06 00:01:10      阅读:442      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   color   

命名的返回值优化:

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

 

比如 一个函数如下:

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

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

  

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

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

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

在gcc下写了一个测试:

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

结果为:

bubuko.com,布布扣

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

命名的返回值优化(Named Return Value optimization (NRVO)),布布扣,bubuko.com

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

标签:style   blog   class   code   java   color   

原文地址:http://www.cnblogs.com/wang-can/p/3704479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有
迷上了代码!