局部变量和变量作为参数传递

时间:2013-01-07 07:58:55

标签: c++ constructor copy-constructor output

我对以下一段代码表示怀疑。函数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

2 个答案:

答案 0 :(得分:1)

  

那么为什么在fun1的情况下没有调用复制构造函数?

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

答案 1 :(得分:1)

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

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