#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
请帮帮我。我在理解这些概念方面遇到了很多困难。
答案 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