函数返回值传递

出自《程序员的自我修养-链接、装载与库》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语言在函数的返回时会使用一个临时的栈上内存作为中转,结果返回值对象会被拷贝两次。因而不到万不得已,不要轻易返回大尺寸对象

你可能感兴趣的:(返回值传递)