go 逃逸分析

逃逸分析

我们知道往往声明一个变量或者申请内存空间时,是需要区分内存区域的,有的可以申请栈空间,有的申请堆空间。go语言中决定变量是分配到栈还是堆,取决于go编译器对程序的逃逸分析。

在程序编译时,如果发现一个变量需要后续一直使用,往往会将其分配到堆内存。看例子:

func test02() *int {
	a := 10
	return &a
}

func main() {
	test02()
}

a在函数中是个临时变量,理论上运行完函数会直接回收,但是函数将其地址返回,这意味着a可能会在其他时间被使用,那么逃逸分析就决定a要分配在堆内存。

使用go build -gcflags "-m -l" test.go查看逃逸分析结果:

# command-line-arguments
./test.go:24:2: moved to heap: a

为什么进行逃逸分析

编译器在编译期间尽量减少堆内存的分配,减少堆内存的回收,减少内存碎片的出现,也就尽量减少gc的出现,加快程序速度。

其他例子

关于逃逸分析还有很多情况下会发生,在这里引用这篇文章记录:

https://studygolang.com/articles/21788?fr=sidebar

posted @ 2021-11-20 20:33  moon_orange  阅读(37)  评论(0编辑  收藏  举报