为什么可以返回结构体指针或临时对象呢?
首先说明一个问题,虽然返回值在函数内部声名并且使用,但函数返回值在返回前从原变量进行数据的转移,这是因为函数调用完毕,其栈要进行回收,这时栈里面的内存变值虽然还可以访问,但其已经标记为回收(因为函数返回后或调用完毕后esp栈进行了平衡,关于函数调用方式,我录了一个视频,你可以点击查看)。
下面我们来说一下函数的返回值,在返回时这个值的转移问题:
当函数的返回值类型为基本数据类型时(双精度浮点型以及非标准的__int64类型除外)作为返回值时,通过寄存器eax来保存返回的数据,而对构体或者类对象等复杂数据属于自定义类型,寄存器eax无法保存对象中的所有数据,所以在函数返回时,寄存器eax无法满足需求。
对于寄存器eax无法保存返回的数据类型时,在函数调用前,编译器会预先将要返回的数据内存空间使用的栈(注意,这里是调用者的栈空间预留)保留出来,这样当函数在退出时,将返回值的数据复制到预先分配的内存栈空间,以这个临时空间的首地址作为首地址作为返回值。由于这个临时空间是调用者函数内部的栈空间,所以说是可用的。
下面我将一段代码为例:
以下为代码的反汇编,注释很详细,如果有不明白的可以私信我
本人最近一直在做一些c/c++语言反汇编的视频,以反汇编的方式揭密C/C++语言的本质,如果有兴趣,可以关注我。
最后,希望我的回答能令你满意。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有