跟踪调用复制构造函数

时间:2015-06-07 04:46:30

标签: c++ copy-constructor

#include <iostream>
using namespace std;

class Student
{
public :
    Student() { };
    Student(const Student& s) { cout << "COPY CONSTRUCTOR CALLED\n";}
};

Student f(Student u)
{
    Student v(u);
    Student w = v;
    return w;
}

main()
{
    Student x;
    Student y = f(f(x));
}

根据我的说法,应该有8个调用,因为每个函数调用都会调用4次复制构造函数。

1)将x复制到参数u
2)将你复制到v
3)将v复制到w
4)返回w

请帮帮我。我在理解这些概念方面遇到了很多困难。

2 个答案:

答案 0 :(得分:0)

每个函数调用将调用复制构造函数3次。这是由于返回值优化(RVO)。第一次调用将调用复制构造函数3次,第二次调用将仅调用构造函数2次,因为第一次调用的返回值传递给第二次调用。

第一次调用复制构造函数时调用:

1) Copying x to u
2) Copying u to v
3) Copying v to w

第二次调用复制构造函数:

1) Copying u to v
2) Copying v to w

在其他地方,优化由编译器完成。

答案 1 :(得分:0)

由于return value optimization (RVO),您希望调用复制构造函数的某些地方不会被调用。

如果我使用以下代码编译代码:

g++ -Wall -std=c++11

我得到以下输出:

COPY CONSTRUCTOR CALLED
COPY CONSTRUCTOR CALLED
COPY CONSTRUCTOR CALLED
COPY CONSTRUCTOR CALLED
COPY CONSTRUCTOR CALLED

如果我使用以下代码编译代码:

g++ -Wall -std=c++11  -fno-elide-constructors

我得到以下输出。

COPY CONSTRUCTOR CALLED
COPY CONSTRUCTOR CALLED
COPY CONSTRUCTOR CALLED
COPY CONSTRUCTOR CALLED
COPY CONSTRUCTOR CALLED
COPY CONSTRUCTOR CALLED
COPY CONSTRUCTOR CALLED
COPY CONSTRUCTOR CALLED
COPY CONSTRUCTOR CALLED