Go 逃逸分析
对于一个 Go 局部变量,如何确定它被分配在堆上还是栈上?
按照官方 FAQ How do I know whether a variable is allocated on the heap or the stack? 的解释:
- Go 编译器会尽可能将变量分配在栈上
- 以下两种情况,Go 编译器会将变量分配在堆上
- 如果一个变量被取地址(has its address taken),并且被逃逸分析(escape analysis)识别为 “逃逸到堆”(escapes to heap)
- 如果一个变量很大(very large)
详细讲解请看下面这几篇文章:
Go内存管理之代码的逃逸分析 (微信公众号 - 网管叨bi叨)
Golang 内存分配之逃逸分析 - 知乎 (zhihu.com)