跟踪对复制构造函数的调用

tracing calls to 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) 将 u 复制到 v
3) 复制 v 到 w
4 ) 返回 w

请帮帮我。我很难理解这些概念。

每次函数调用都会调用3次拷贝构造函数。这是由于 Return 价值优化 (RVO)。第一次调用将调用复制构造函数 3 次,第二次调用将调用构造函数 2 次,只是因为第一个的 return 值被传递给第二个。

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

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

其他地方由编译器优化。

由于 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