函数调用时基于栈和基于寄存器有什么区别?
在第一课后,我们有看文章关于函数调用规约的。 现在的go的函数调用就会在栈上面操作,进栈/出栈等等。但是未来会改到寄存器(有github讨论,也有blog的陈述)。
栈和寄存器都是“虚拟”出来的,既然寄存器更快,为什么编程语言实现函数调用不都基于寄存器呢?另外我也有看到一些文章说,其实寄存器也是被虚拟出来的,部分语言也用内存虚拟寄存器。
函数调用就是需要进栈/出栈的效果,这样一来,其实是内存上,还是寄存器上,感觉是不是无所谓了?只要能存一个临时的数据即可。那基于栈的和基于寄存器的实现到底有什么区别呢?如果虚拟寄存器也有使用内存来虚拟,那基于栈和基于寄存器,本质上速度不是一样吗?
18
收起
正在回答 回答被采纳积分+1
1回答
Xargin
2021-06-29 22:22:21
程序用的是虚拟内存,但你在访问内存的时候,虚拟内存肯定还是要访问物理内存的。。这个是抽象
寄存器一般不是虚拟出来的,Go 语言比较特殊,是为了编程方便,所以在汇编代码里有几个虚拟寄存器,这些东西在最终的汇编代码一定是被翻译成物理寄存器的~
从硬件来说,内存和寄存器实现的物理元件都不一样,内存是 DRAM,寄存器一般是 SRAM,SRAM 要比 DRAM 快很多。
这种速度快是有代价的,主要代价就是贵,所以本身寄存器的数量都是有限的,每个寄存器有固定的名字,寄存器的总数量也是有限的。
用寄存器来传参数可以加速函数调用过程,但你也可以看到,因为寄存器数量有限,但函数参数是可以无限的,总会有参数数量超过寄存器数量的时候,所以就算是用寄存器来做函数调用优化,在超出寄存器数量之后,还是要用到栈来传参的~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星