对象作为返回值与对象作为参数处理方法非常类似,对象作为参数时,进入函数前预先将对象使用的栈空间保留出来,并将实参对象中的数据复制到栈空间保留出来,并将实参对象中的数据复制到栈空间中。该栈空间作为函数参数,用于函数内部使用。同理对象作为返回值时,进入函数后将申请返回对象使用的栈空间,在退出函数时,将返回对象中的数据复制到临时的栈空间中,以这个临时栈空间的首地址作为返回值。
CMyString MyString ;
MyString=GetMystring()
这里我主要把那个 返回对象 临时对象 对象objA 圈了起来,因为这里有个赋值(拷贝)流程(这里的拷贝并未调用到拷贝构造函数,这里拷贝的意思是汇编层面的拷贝)详情的话可以私下了解一下汇编代码,然后看起来会受益匪浅,首先
返回对象---->临时对象
临时对象----->对象objA
在GetCReturn中,有个局部对象,局部对象拷贝(依然是汇编层面的拷贝)到返回对象中,
这里大家会不会在想,直接把局部对象拷贝给临时对象不就得了嘛?为什么还得局部对象到返回对象,返回对象到临时对象。这里按照我的理解是:
因为传过来的返回对象的地址和局部对象的地址是不一样的,返回对象拷贝到临时对象这个操作是在
call完GetCReturn函数后进行拷贝(由地址4012BA以下可知),此时才能有效开辟临时空间(因为在GetCReturn内开辟临时空间,函数结束后,空间也就没了,相当于开辟了个寂寞),所以在函数内部根本不可能找到一个临时空间来用,只能到先传递给返回对象,让返回对象在函数外来找一个临时空间进行拷贝,照这里的操作,感觉这个返回对象的生命周期应该会比函数内的局部对象生命周期长那么一点点
接上上面的流程就是
局部对象---->返回对象
返回对象---->临时对象
临时对象----->对象objA
(疑问点:返回对象的空间是在main函数里开辟(结合地址401293以及地址4012AE可看出)的,生命周期相比局部对象更长,为什么要使用局部对象来赋值?直接用返回对象来赋值,不是更简便吗?还可以省了一次拷贝)
但是我感觉这个返回对象的生命周期挺长的呀