企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 第三章? 函数开始和结束 函数开始的指令,是像下面这样的代码片段: ``` #!bash push ebp mov ebp, esp sub esp, X ``` 这些指令做了什么:将寄存器EBP的值入栈,将ESP赋值给EBP,在栈中分配空间, 用来保存局部变量。 在函数执行过程中,EBP是固定的,可以用来访问局部变量和函数参数。也可以使用 ESP,但在函数运行过程中,ESP会变化,使用起来不方便。 ``` #!bash mov esp, ebp pop ebp ret 0 ``` 函数在运行结束时,会释放在栈中所申请的内存,EBP的值出栈,将代码控制权还原 给调用者。 ## 3.1 递归 函数调用开始和结束使递归变得难以理解。 举个例子,有一次我写了一个函数遍历二叉树右侧节点。使用了看起来很高?上的递归函数,但由于每次函数调用开始和结束都需要花费很长时间,它运行速度比迭代方 式要慢好多倍。 顺便提一下,这就是尾部调用存在的原因。