更新于 

什么是栈帧(stack frame)

定义

🧱 一句话定义:函数的栈帧(stack frame)是函数在运行时在栈(stack)上分配的一块内存,用来保存:参数,返回值,局部变量,返回地址,可能还有调用者的一些上下文信息(如寄存器、defer 信息等)

🧠 为什么需要栈帧?

当你调用一个函数时,程序需要一个临时的空间来处理这个函数的所有工作:

  • 把参数传进去
  • 处理内部变量
  • 保存结果
  • 返回之后还能回到调用处继续执行

这些工作都靠“栈帧”来完成。

🧩 举个简单例子

1
2
3
4
func add(a, b int) int {
result := a + b
return result
}

当你调用 add(2, 3) 时,栈帧大概会这样安排:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
main 函数栈帧

调用 add(2, 3)

-----------------------------
| 返回地址(main中的下一行)|
| 参数 b = 3 |
| 参数 a = 2 |
| 局部变量 result = 5 |
| 返回值 = 5 |
-----------------------------

return,返回 5

sum := 5,继续执行

每次调用 add,都会在栈顶开出这样一块独立的空间,函数运行完就销毁它(出栈)。

🎮 类比一下好理解:

  1. 想象你去参加游戏闯关(函数调用):

  2. 你每到一关(函数),门口会给你发一个背包(栈帧)。

  3. 背包里有你这关需要的东西(参数、变量、奖励等)。

  4. 通关时你交出背包(return),里面的奖励(返回值)就是你带出这关的东西。

  5. 如果你掉了东西(panic),工作人员会根据背包里的备份(defer)帮你收拾残局。