Go语言的函数调用和C语言的函数调用是十分相似的,所以我们先来通过讲解C语言函数栈帧的调用,然后再来讲解Go语言的。
由于讲解汇编语言是非常困难的,所以我看完汇编之后,把特性直接总结给大家了,如果后期有时间,会补上,C语言函数创建的汇编的讲解。
edi, esi, edx, ecx, r8d, r9d这6个寄存器传递函数的返回值通过eax寄存器来进行传递,由于只使用一个寄存器存储返回值,所以C语言的函数不能同时返回多个值。
分析了Go语言编译后的汇编指令后,我们可以发现,Go用栈传递参数和接收返回值,所以它只需要在栈上多分配一些内存就可以返回多个值。
eax寄存器传递返回值Go语言的参数传递跟C语言一样,是传值,传值就意味是复制,调用方和被调用方看到的是不同的数据。
如果要传递的数据量很大的话,那么最好传递指针,减少内存拷贝的开销。
Go通过栈传递函数的参数和返回值,在调用函数之前会在栈上为返回值分配合适的内存空间,随便将入参从左按顺序压栈并复制参数,而参数的计算是从右到左的(栈的特性)。