函数返回值传递

来源:互联网 发布:乔丹职业生涯场均数据 编辑:程序博客网 时间:2024/06/06 18:31

出自《程序员的自我修养-链接、装载与库》P299

eax,edx是函数传递返回值的寄存器,这是由芯片厂商和编译器决定的。

1.对于小于4个字节的数据函数将返回值存储在eax中。

2.5~8个字节对象的情况调用惯例都是采用eax和edx的联合返回方式进行,eax存放低32位,edx存放高32位。

3.大于8个字节的返回类型,用一下代码测试:

复制代码
 1 typedef struct big_thing 2 { 3     char buf[128]; 4 }big_thing; 5  6 big_thing return_test() 7 { 8     big_thing b; 9     b.buf[] = 0;10     return b;11 }12 13 int main()14 {15     big_thing n = return_test();16 }
复制代码
  • 首先main函数在栈额外开辟了一片空间,并将这块空间的一部分作为传递返回值的临时对象,这里称为temp
  • 将temp对象的地址作为隐藏参数传递个return_test函数
  • return_test 函数将数据拷贝给temp对象,并将temp对象的地址用eax传出。
  • return_test返回以后,mian函数将eax 指向的temp对象的内容拷贝给n。

如果返回值的类型的尺寸太大,c语言在函数的返回时会使用一个临时的栈上内存作为中转,结果返回值对象会被拷贝两次。因而不到万不得已,不要轻易返回大尺寸对象

0 0
原创粉丝点击