标签:style blog class code java color
命名的返回值优化:
针对返回一个局部的变量的优化,可以直接用返回的结果对象直接替代局部变量,从而减少了一个复制拷贝,从而提高效率。
比如 一个函数如下:
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却也行,所以表示怀疑。
命名的返回值优化(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