欢迎光临散文网 会员登陆 & 注册

[C++] 函数怎样返回一个对象——返回值优化初识

2023-03-15 13:06 作者:斑驳陆离今石洋  | 我要投稿

f(){

...

return ret;

}

main:

A a=f();

没有任何的对象的移动,返回值优化,不把f的返回值放在f堆栈上,直接使用a的地址来存放返回值ret的对象。

可以产生的优化结果:类似f被inline了,没有多余的对象被产生,没有多余的对象的搬运产生,所有复制过程都消除。


此时构造ret的地址就是构造a的地址,没产生单独的ret对象,且没调用任何拷贝搬运构造函数。

构造两个返回对象,对象在两个地址上,最终返回的时候,需要把其中的一个对象移动到a的地址上去,移动构造发生的地址就是a的地址,在过程中需要调用一个移动构造函数,原因是我们不知道到一是要把ret1还是ret2放在最后返回的a的地址上去。

比之前多了一次调用移动构造函数,原因是没有办法在一开始决定把那个对象构造在需要的返回的地址上,所以只能先构造在f的堆栈上,然后在调用一步移动构造函数



临时对象的情景:

a先被构造存在数据,通过赋值符号的重载先释放,导致f的调用得首先提供一个存放f返回值的临时对象的一个地址,在f返回之后该地址就是返回的对象,再通过默认的移动构造将临时对象的值赋给a。

geta函数内构造了新的对象存放在8470,由main函数提供,刚好在a旁边。

结束后调用移动赋值,将零食对象赋给a的地址。

构造两个返回对象,根据输入来决定返回对象

由main生成临时地址,以后上同

过程,将返回的对象通过移动构造函数构造到临时对象的地址上,之后调用移动赋值函数,将返回值赋给a



生命周期延长,如果f需要返回对象,那么f的调用者需要提供一小块内存保存返回的对象,期生命周期只有一个语句

出了该语句就会被析构掉。

利用A&&保存临时对象,与A a=f()没有很大不同?

生命周期延长延长的是返回对象的生命时间,若临时对象内部包含别的引用,其实并没有延长那个引用所引用的对象的生命时间???




为什么返回对象?

不只是数据,包括其操作。

包含p以及释放该p的析构函数,实质上返回了一个可以自动释放的内存,可保证无论和操作于内存,可按时释放,若想保存可自行移动拷贝,放置生命周期更长的对象上。


栈的结构决定了数据的移动

[C++] 函数怎样返回一个对象——返回值优化初识的评论 (共 条)

分享到微博请遵守国家法律