9.2 活动记录与栈帧
活动记录(activation record)描述一次函数调用需要携带的运行时上下文。栈帧(stack frame)是这份上下文在内存中的具体布局。
很多人把栈帧理解成“局部变量盒子”,这不够。它同时承担控制流恢复与状态保存职责。
一个典型栈帧可能包含:
- 返回地址
- 保存的帧指针/寄存器
- 参数区或调用扩展区
- 局部变量与溢出(spill)临时
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
返回为什么能回到对的地方
函数调用会改变控制流。函数返回时之所以能回到调用点,是因为栈帧里保存了恢复所需信息(最核心是返回地址)。
这类布局约束还会影响:
- 调试器回溯能力
- 异常展开
- 性能分析器栈采样
- 跨模块一致行为
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
递归深度就是帧深度
递归每深入一层,就多一个帧。设线程栈大小为 ,平均每帧开销为 ,粗略上限可写成:
但工程上不能直接拿理论值上线。运行时、库调用和不可控调用链都要预留空间。
尾调用优化在满足条件时可以复用当前帧,把线性增长改成近似常量帧占用,这会显著改变递归预算。
实战视角
当你看到递归导致栈压力,通常有三类手段:
- 降低每帧体积
- 启用可证明安全的尾调用消除
- 改写递归结构
这些都离不开对活动记录的精确理解。
正在加载概念检查...