0

我是 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。

4

1 回答 1

2

返回值优化 (RVO) 指出编译器可以省略一个或两个副本,但这不是必需的。这意味着:

A a (Foo());

可以自由地做 0、1 或 2 个复制构造函数:

2 - 在函数 Foo() 中,A a创建一个A. 当它试图返回时,它将 复制A到返回值中;生成的初始化A a(Foo());将结果复制Foo()到一个新的A.

1 - 其中一个副本不会发生(可能是副本 intoFoo的返回值。

0 - 这些副本都没有发生。A a里面的created直接Foo变成了A这一行的created:A a(Foo());

Msdn 有很多关于Visual c++ 编译器如何处理 RVO的细节。它有一些简洁的代码示例来解释它是如何有效地工作的。

于 2013-09-09T20:55:16.753 回答