关于golang:go的值类型和引用类型2内存分配规则

9次阅读

共计 472 个字符,预计需要花费 2 分钟才能阅读完成。

什么是逃逸剖析?
把本该调配在栈上的变量调配到了堆,则产生了逃逸。剖析这种状况的行为就是逃逸剖析。

go 为变量分配内存的规定:
全局变量,援用类型的调配在堆上,值类型的调配在栈上。
局部变量,个别调配在栈上。如果局部变量太大,则调配在堆上。如果函数执行完,依然有内部援用此局部变量,则调配在堆上。
案例:

var global *int

func f() {
    var x int
    x = 1
    global = &x
}

func g() {y := new(int)
    *y = 1
}

函数里的 x 变量必须在堆上调配,因为它在函数 f() 退出后仍然能够通过包一级的 global 变量找到,尽管它是在函数外部定义的。

在函数里初始化一个援用类型的变量 a := make(map[int]int,10)。其中,变量名 a 在栈中,其指向的地址在堆空间。
在函数里通过 b:= a 实现拷贝,这是一个浅拷贝 (援用类型的拷贝都是浅拷贝)。栈上新建 b,指向 a 指向的内存地址。

变量空间回收规定:
调配在栈中的变量,在函数执行完结后由零碎将内存回收,是平安的;如果调配在堆中,则函数执行完结由 GC(垃圾回收)解决。

插一句:所有的 GC 都是针对堆的。

正文完
 0