专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

为什么可以返回结构体指针或临时对象呢_java

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/3/8 18:41:19       共计:3580 浏览

为什么可以返回结构体指针或临时对象呢?

首先说明一个问题,虽然返回值在函数内部声名并且使用,但函数返回值在返回前从原变量进行数据的转移,这是因为函数调用完毕,其栈要进行回收,这时栈里面的内存变值虽然还可以访问,但其已经标记为回收(因为函数返回后或调用完毕后esp栈进行了平衡,关于函数调用方式,我录了一个视频,你可以点击查看)。

下面我们来说一下函数的返回值,在返回时这个值的转移问题:

当函数的返回值类型为基本数据类型时(双精度浮点型以及非标准的__int64类型除外)作为返回值时,通过寄存器eax来保存返回的数据,而对构体或者类对象等复杂数据属于自定义类型,寄存器eax无法保存对象中的所有数据,所以在函数返回时,寄存器eax无法满足需求。

对于寄存器eax无法保存返回的数据类型时,在函数调用前,编译器会预先将要返回的数据内存空间使用的栈(注意,这里是调用者的栈空间预留)保留出来,这样当函数在退出时,将返回值的数据复制到预先分配的内存栈空间,以这个临时空间的首地址作为首地址作为返回值。由于这个临时空间是调用者函数内部的栈空间,所以说是可用的。

下面我将一段代码为例:

以下为代码的反汇编,注释很详细,如果有不明白的可以私信我

本人最近一直在做一些c/c++语言反汇编的视频,以反汇编的方式揭密C/C++语言的本质,如果有兴趣,可以关注我。

最后,希望我的回答能令你满意。

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:混得好不好能从哪里看出来_java | ·下一条:深圳汉ev补贴取消了吗_java

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有