跟踪对复制构造函数的调用
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
#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