golang中的栈帧

389 阅读1分钟

这是一个32位的操作系统

在这里插入图片描述

栈帧和栈

栈:启动程序后操作系统分配的空间
栈帧: 当函数运行时,需要存储空间,这些空间就叫做栈帧。

  1. 用来给函数运行提供内存空间,在stack上产生
  2. 当函数调用时,产生栈帧。函数调用结束,释放栈帧
  3. 栈帧存储:1.局部变量 2.形参(形参的地位和局部变量的地位相同) 3.内存字段描述值(栈顶指针,栈基指针)

运行下面的代码,内存分配情况

package main

import "fmt"

func test(t int)  {
	var tt = 123
	fmt.Println(tt+t)
}

func main() {
	var a int = 10
	var p * int = &a
	test(5)
	a = 100
	fmt.Println(a)
	*p = 250
	fmt.Println(*p, a)
} 

函数运行内存申请

首先运行main函数,系统会在stack中申请一块栈帧空间(1个函数申请一个栈帧空间),main函数中的操作都在申请到栈帧空间中进行操作
在这里插入图片描述
如果main函数中有其他的函数,操作系统会在stack中的main函数下面依次申请栈帧,然后test函数使用该栈帧申请的空间
在这里插入图片描述

函数结束内存释放

栈帧是有栈顶指针和栈基指针,每次申请栈帧时栈基指针和栈顶指针所记录的位置都会发生变化,如上面的两个图所示,每次运行新的函数就向下移动申请新的空间(同时也会记录该函数的栈顶指针和栈基指针数值),如果该函数运行完则这两个指针会上移,也就是释放内存