C++ 函数返回值为对象时调用复制构造函数的问题
知识点:
C++中调用复制构造函数的三种情况:
- 通过一个对象构造另一个对象
- 调用参数为对象的函数
- 调用返回值为对象的函数
– 上述知识点在各种书籍、博客都无不同,属于C++的标准
– 但是实际测试的时候,当调用返回值为对象的函数时,并未按预想地调用复制构造函数。
– 在查阅了很多博客资料后,原因如下:
-
当调用返回值为对象的函数时,系统消耗调用复制构造函数、调用构造函数、调用析构函数的代价,为了减少消耗,编译器使用了一项名为返回值优化的技术,使得调用函数时不需要调用复制构造函数
-
具体过程如下:
class Person{
string name;
int age;
Person(string name,int age){
this->name = age;
this->age = age;
}
//复制构造函数
Person(const Person& p){
cout<<"调用复制构造函数";
}
};
//返回一个Person对象
Person create(string name,int age){
return new Person(name,age);
}
int main(){
Person p = create("张三",20);
}
优化前:调用create函数时,先根据传入的参数生成一个临时对象 t1(栈中),然后拷贝生成临时对象 t2(栈外),函数执行完毕,返回 t2的地址,t1被回收;p根据返回的 t2 地址构造对象
优化后:调用create函数时,编译器偷偷地增加了一个参数,传入了p的地址,直接在函数内部构造了p对象