对于全局变量:
引用类型的全局变量分配在堆上
值类型的全局变量分配在栈上
对于局部变量,要具体情况具体分析,它不取决于是var还是new出来,
以下面代码为例:
- x在函数结束后,仍会被包级别的global使用,也就是局部变量x从函数f中逃逸了,那x必须分配在堆上
- 与之对应的*y在函数g结束后将不再可达,也就是会被立即回收,因此在栈上分配空间
var global *int
func f() {
var x int
x = 1
global = &x
}
func g() {
y := new(int)
*y = 1
}
一点说明:
- 栈:由操作系统分配和释放
- 堆:由程序员自己搞定(C/C++),当然一些语言提供了较完善的GC机制,比如Java、Golang、Python等,感兴趣的同学可以去了解一下
- 垃圾回收都是针对堆的