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