C++中函数返回临时对象和本地对象的区别
2016-12-05 22:00
330 查看
在C++中如果函数返回值是对象的时候,那么该直接返回临时对象呢,还是先在函数体内构造好一个本地
对象,然后返回。如果可以直接返回临时对象,那么我们就返回临时对象来代替返回本地对象,因为这样代码
的效率会比返回本地对象的效率高。以下通过代码说明两者的区别(更多讲解在注释中已说明):
1.返回本地对象代码示例:
[cpp] view
plain copy
print?
#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.返回临时对象代码示例:
[cpp] view
plain copy
print?
#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;
}
运行结果:
所以总的来说返回临时对象能减少多余的拷贝构造函数和析构函数的调用,从而提高了效率。
对象,然后返回。如果可以直接返回临时对象,那么我们就返回临时对象来代替返回本地对象,因为这样代码
的效率会比返回本地对象的效率高。以下通过代码说明两者的区别(更多讲解在注释中已说明):
1.返回本地对象代码示例:
[cpp] view
plain copy
print?
#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.返回临时对象代码示例:
[cpp] view
plain copy
print?
#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;
}
运行结果:
所以总的来说返回临时对象能减少多余的拷贝构造函数和析构函数的调用,从而提高了效率。
相关文章推荐
- C++中函数返回临时对象和本地对象的区别
- 关于C++中在函数中按值返回、临时对象、拷贝构造函数的一点理解
- 【翠字营原创】: C++ 临时对象分析小结 涉及函数参数值传递、函数返回值、仿函数
- C++中函数指针和函数对象的区别与联系
- c++返回函数局部对象的引用
- 一个函数返回临时对象引起的编译器优化问题
- 类成员函数返回对象和返回引用的区别
- 不要返回c++临时对象的指针
- C++函数返回值为对象时,构造析构函数的执行细节
- C++成员函数返回对象的引用
- C++小课堂--第一期---面向对象之前 --- 实现函数返回结构体,实现大数据的传输
- printf和wprintf、printf输出结束标识符、c++按值返回临时对象是否是const的实验
- C/C++函数如何返回struct或class对象
- c++ static的作用,以及static对象在类和函数中区别
- 【C++对象模型】函数返回C++对象的问题
- [C/C++]函数如何返回struct或class对象
- c++对象成员函数返回自身引用时出现的诡异问题及解决办法
- C++浅析——返回对象的函数
- C++函数参数传值OR传引用_C++函数返回值返回对象OR对象引用
- 条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用 (转自effective c++ second edition)