命名的返回值优化:
针对返回一个局部的变量的优化,可以直接用返回的结果对象直接替代局部变量,从而减少了一个复制拷贝,从而提高效率。
比如 一个函数如下:
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却也行,所以表示怀疑。
时间: 2024-10-13 10:07:42