目录
接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,或文章末尾扫描二维码,自动获得推文和全部的文章列表。
没有启用返回值优化时,怎么从函数内部返回对象
当在函数的内部中返回一个局部的类对象时,是怎么返回对象的值的?请看下面的代码片段:
class Object {}
Object foo() {
Object b;
// ...
return b;
}
Object a = foo();
对于上面的代码,是否一定会从foo函数中拷贝对象到对象a中,如果Object类中定义了拷贝构造函数的话,拷贝构造函数是否一定会被调用?答案是要看Object类的定义和编译器的实现策略有关。我们细化一下代码来进一步分析具体的表现行为,请看下面的代码:
#include <cstdio>
class Object {
public:
Object() {
printf("Default constructor\n");
a = b = c = d = 0;
}
int a;
int b;
int c;
int d;
};
Object foo() {
Object p;
p.a = 1;
p.b = 2;
p.c = 3;
p.d = 4;
return p;
}
int main() {
Object obj = foo();
printf("%d, %d, %d, %d\n", obj.a, obj.b, obj.c, obj.d);
return 0;
}
编译成对应的汇编代码,看一下是怎么从foo函数中返回一个对象的,下面节选main和foo函数的汇编代码:
foo():