我是c++新手,我在wiki和这个网站上读到了一些关于返回值优化的文章,但是我仍然很好奇下面的行为是如何发生的:
using namespace std;
class A
{
public:
A() {cout << "A Ctor" << endl;}
A(const A &a) {cout << "A copy Ctor" << endl;}
};
A Foo()
{
A a;
return a;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Foo()" << endl;
Foo();
cout << "Foo() and new object" << endl;
A b(Foo());
return 0;
}产出如下:
Foo()
A Ctor
A copy Ctor
Foo() and new object
A Ctor
A copy Ctor我的问题是,为什么Foo();和A b(Foo());都只触发一个复制构造函数调用?这是否意味着从Foo()返回的复制值可用于在该位置构造对象b,从而不需要再次调用b的构造函数?这是基于2010。
发布于 2013-09-09 20:55:16
返回值优化(RVO)声明编译器可以删除一个或两个副本,但它不是必需的。这意味着:
A a (Foo());可以自由执行0、1或2个复制构造函数:
2-在函数Foo()中,A a创建一个A。当它尝试返回时,它将A复制到返回值中;结果的初始化A a(Foo());将Foo()的结果复制到一个新的A中。
其中一个副本不会发生(可能是复制到Foo的返回值。
这些副本都不会发生。在A a中直接创建的Foo变成了在以下一行中创建的A:A a(Foo());
Msdn有很多关于visual c++编译器处理RVO如何实现的详细信息。它有一些简洁的代码示例来解释它是如何有效工作的。
https://stackoverflow.com/questions/18706451
复制相似问题