0

我对以下代码有疑问。功能fun1fun2都是一样的。在一个中,我声明了一个局部变量,在另一个中,一个变量通过参数传递。那么为什么不调用 fun1 复制构造函数。

#include<stdio.h>
#include<iostream>
using namespace std;
class A
{
    public:
A()
{
    printf("constructor\n");
}
A(const A&)
{
    printf("copy cons\n");
}
~A()
{
    printf("destructor\n");
}
};
A fun1()
{
A obj;
return obj;
}
A fun2(A obj)
{
return obj;
}

int main()
{
    A a=fun1();
    printf("after fun1\n");
    A b;
    A c = fun2(b);
}

输出

constructor
after fun1
constructor
copy cons
copy cons
destructor
destructor
destructor
destructor
4

2 回答 2

1

那么为什么不调用 fun1 复制构造函数呢?

如果A具有可访问的副本或移动构造函数,编译器可能会选择省略副本。这就是所谓的(命名的)返回值优化((N)RVO)

于 2013-01-07T08:02:24.103 回答
1

由于命名返回值优化,这是编译器对您的代码执行的优化。它认识到函数 fun1() 的返回类型与 fun1() 中的临时对象(类型 A)相同,因此它不会创建它的副本(不调用复制构造函数)返回声明。

您可以尝试在不优化的情况下编译代码,然后查看是否调用了复制构造函数。如果您使用 gcc 编译器,关闭优化的编译器标志是“-O0”。

于 2013-01-07T08:02:41.777 回答