首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++返回值优化

C++返回值优化
EN

Stack Overflow用户
提问于 2013-09-09 20:24:58
回答 1查看 739关注 0票数 0

我是c++新手,我在wiki和这个网站上读到了一些关于返回值优化的文章,但是我仍然很好奇下面的行为是如何发生的:

代码语言:javascript
复制
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;
}

产出如下:

代码语言:javascript
复制
Foo()
A Ctor
A copy Ctor
Foo() and new object
A Ctor
A copy Ctor

我的问题是,为什么Foo();A b(Foo());都只触发一个复制构造函数调用?这是否意味着从Foo()返回的复制值可用于在该位置构造对象b,从而不需要再次调用b的构造函数?这是基于2010。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-09 20:55:16

返回值优化(RVO)声明编译器可以删除一个或两个副本,但它不是必需的。这意味着:

代码语言:javascript
复制
A a (Foo());

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

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

其中一个副本不会发生(可能是复制到Foo的返回值。

这些副本都不会发生。在A a中直接创建的Foo变成了在以下一行中创建的AA a(Foo());

Msdn有很多关于visual c++编译器处理RVO如何实现的详细信息。它有一些简洁的代码示例来解释它是如何有效工作的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18706451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档