GO 栈
布局
- return address:函数调用时由call执行自动压榨
- calls BP:调用者的栈帧基址
- locals : 函数的局部变量
- args to callee: 调用函数的返回值和参数
- B站视频地址
原理
- 用户执行代码存储到内存的代码段
- 如果一个函数调用另一个函数,编译器就会生成一条call指令,程序执行这条指令时,会跳转到被调用函数入口处执行,
- 函数执行完成后通过RET指令跳回调用者处继续执行。
- go语言函数栈一次分配,防止栈越界,如果需要栈增长,通过函数的检测代码,从新分配栈空间,复制老的栈数据。
- ret指令前,编译器还会插入指令,恢复调用者栈基地址,释放被调用函数栈空间
- ret指令作用:弹出call指令压栈的返回地址,跳转到该地址
- 函数返回前先给返回值赋值,在执行defer函数。