这是一个32位的操作系统
栈帧和栈
栈:启动程序后操作系统分配的空间
栈帧: 当函数运行时,需要存储空间,这些空间就叫做栈帧。
- 用来给函数运行提供内存空间,在stack上产生
- 当函数调用时,产生栈帧。函数调用结束,释放栈帧
- 栈帧存储: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函数使用该栈帧申请的空间
函数结束内存释放
栈帧是有栈顶指针和栈基指针,每次申请栈帧时栈基指针和栈顶指针所记录的位置都会发生变化,如上面的两个图所示,每次运行新的函数就向下移动申请新的空间(同时也会记录该函数的栈顶指针和栈基指针数值),如果该函数运行完则这两个指针会上移,也就是释放内存