函数的序幕,是像下面这样的代码片段:
push ebp
mov ebp, esp
sub esp, X
这些指令做了什么:将寄存器EBP的值入栈,将ESP赋值给EBP,在栈中分配空间, 用来保存局部变量。
在函数执行过程中,EBP是固定的,可以用来访问局部变量和函数参数。也可以使用 ESP,但在函数运行过程中,ESP会变化,使用起来不方便。
mov esp, ebp
pop ebp
ret 0
函数调用开始和结束使递归变得难以理解。
举个例子,有一次我写了一个函数遍历二叉树右侧节点。使用了看起来很高⼤上的递归函数,但由于每次函数调用开始和结束都需要花费很长时间,它运行速度比迭代方 式要慢好多倍。
顺便提一下,这就是尾部调用存在的原因。