对象作为函数参数和返回值的传递方式

在函数调用时,把对象作为参数传递,需要调用复制构造函数,但是这些工作具体是如何做的?结合基本数据类型在函数调用中的传递方式。
函数调用时传递基本类型的数据是通过运行栈,传递对象也一样是通过运行栈。运行栈中,在主调函数和被调函数之间,有一块两者都要访问的公共区,主调函数 把实参值写入其中,函数调用发生后,被调函数通过读取这段区域就可得到形参值。 需要传递的对象,只要建立在运行栈的这段区域上即可。传递基本类型数据与传递对象不同在于,将实参值复制到这段区域上时,对于基本数据类型参数,作一般内存读写操作即可,但对于对象参数,则需要调用复制构造函数。main函数中调用下函数:

fun1(b);

调用它时,就需要调用b对象的复制构造函数,使用对象b在运行栈的传参区域上构造一个临时对象,这个函数在主调函数中无名,但地址却可以计算,因此编译器可以调用b对象的复制构造函数,为这个对象初始化。对象参数的复制构造函数的调用在跳转到fun1函数入口地址之前完成。
有时传递对象参数时,编译器会做出适当的优化,使得复制构造函数 不必被调用。例如

fun1(Point(1,2));

最直接的做法是,先构造一个Point类型的临时对象,再以这个对象为参数调用复制构造函数,在运行栈的传参区域上生成一个临时对象,再执行fun1函数的代码。但是调用两个临时对象有一点多余,更好的做法是,直接使用Point类的构造函数,在运行栈传参区域上建立临时对象,这样就免去了一次复制构造函数的调用。 如果在传参时发生由构造函数所定义的类型转换,复制构造函数的调用同样可以免去。
返回一个对象时,返回值的传递方式。传递返回值,需要创建无名临时对象,但是对象具体创建过程?由于主调函数需要获得返回值,所以这个临时对象需要创建在主调函数的栈帧上,那么被调函数如何影响主调函数所创建的临时对象呢?
比较通行的处理方式是,由主调函数决定临时对象的创建位置,然后把临时对象的地址作为参数传递给被调函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值