我知道每当返回对象时都会调用复制构造函数。在我的下面的案例中,复制construcotr没有调用。
我在互联网上浏览,我开始知道编译器遵循return value optimization
技术。我相信由于没有调用复制构造器。这是真的吗?
程序控制如何进入?
//一些代码在这里
demo demo::display()
{
demo temp(10);
temp.rate=45;
return temp; //copy constructor is not called here
}
int main( )
{
demo obj1=obj1.display();
return 0;
}
答案 0 :(得分:1)
原因是编译器优化,如您所知。创建临时对象然后复制它,然后将该副本放在obj1中,然后销毁temp,这是浪费资源。相反,编译器知道obj1将获得temp的值,因此它实际上在obj1所在的相同内存位置创建了对象temp。所以没有任何东西被复制,什 构造函数也只调用一次,temp和obj1是同一个对象。 它被称为返回值优化或RVO。
对于尚未初始化的对象调用函数并不明智。
有些情况不能以这种方式应用...... 如果你这样做了:
demo demo::display(int unknown)
{
demo temp1(10);
demo temp2(11);
if(unknown) return temp1;
else return temp2;
}
现在,编译器不知道将返回两个对象中的哪一个,因为这取决于显示函数的参数,因此将在显示范围内创建temp1和temp2。然后在运行时,当知道它们中的哪一个将被返回时,它将被复制(猜测在哪里?)在obj1所在的完全相同的位置。 试试这个,你会看到复制构造函数被调用。