首页 > XCode的这里为什么没调用拷贝构造函数呢,是不是编译器作了什么优化

XCode的这里为什么没调用拷贝构造函数呢,是不是编译器作了什么优化


这种东西叫做返回值优化

返回值优化(Return value optimization,缩写为RVO)是C++的一项编译优化技术。即删除保持函数返回值的临时对象。这可能会省略两次复制构造函数,即使复制构造函数有副作用。

然后因为你的a是一个临时变量,并且没有做什么有意义的操作,有时编译器会优化掉这一句语句(A a = fun();),当然一般情况下编译器只会在用户开启优化的时候这么做。。


编译器做了NRVO(named return value optimization,具名返回值优化),所谓具名返回值优化,是指你像下面这样显式给出了返回值

A a;
return a;

如果你写的是

return A();

那编译器做的就是RVO,二者大同小异。
具体做法如下:
编译器调整了函数的结构,把A a=fun();a的引用作为fun的参数,相当于有个函数void fun(A& a);然后你调用fun(a);在函数内调用a的构造函数

void fun(A& a)
{
//调用a的构造函数
}

对象的构造分两个步骤,首先分配内存空间,然后调用构造函数,这里a的内存是在fun函数外被分配,而构造函数是在fun函数内部调用。

【热门文章】
【热门文章】