C++中函数返回临时对象和本地对象的区别
在C++中如果函数返回值是对象的时候,那么该直接返回临时对象呢,还是先在函数体内构造好一个本地
对象,然后返回。如果可以直接返回临时对象,那么我们就返回临时对象来代替返回本地对象,因为这样代码
的效率会比返回本地对象的效率高。以下通过代码说明两者的区别 (更多讲解在注释中已说明):
1.返回本地对象代码示例:
#include <iostream>
using namespace std;
class A {
public:
int m_k;
int m_t;
A(int k, int t) :m_k(k), m_t(t) {
cout << "construct...." << endl;
}
~A() {
cout << "destruct...." << endl;
}
A(A &a) {
cout << "copy construct..." << endl;
}
};
// 如果函数返回值是一个对象,要考虑return语句的效率
A getObj() {
/************** 返回本地对象 ****************/
/* 以下这种写法实际上执行了三步:
1. 构造本地对象a
2. 调用拷贝构造,将本地对象a拷贝到外部存储器
3. 调用析构函数析构本地对象a
*/
/******************************************/
A a(3, 4);
return a;
}
int main() {
getObj(); // 外部存储单元
return 0;
}
运行结果:
2.返回临时对象代码示例:
#include <iostream>
using namespace std;
class A {
public:
int m_k;
int m_t;
A(int k, int t) :m_k(k), m_t(t) {
cout << "construct...." << endl;
}
~A() {
cout << "destruct...." << endl;
}
A(A &a) {
cout << "copy construct..." << endl;
}
};
// 如果函数返回值是一个对象,要考虑return语句的效率
A getObj() {
/*********** 直接返回临时对象 *************/
// 编译器直接把临时对象创建并初始化在外部
// 存储单元(主调函数的栈帧上)中,省去了拷
// 贝和析构的花费,提高了效率
/*****************************************/
return A(3, 4);
}
int main() {
getObj(); // 外部存储单元
return 0;
}
运行结果:
所以总的来说返回临时对象能减少多余的拷贝构造函数和析构函数的调用,从而提高了效率。