简介
编译代码时,编译器根据分析,判断将变量分配在栈
或堆
上。
一般情况
函数定义中,一般将局部变量和参数分配到栈上(stack frame)上。但是,如果编译器不能确定在函数返回(return)时,变量是否被引用(reference),分配到堆上;如果局部变量非常大,也应分配在堆上。
如果对变量取地址(*和&操作),则有可能分配在堆上。此外,还需要进行逃逸分析(escape analytic),判断return后变量是否被引用,不引用分配到栈上,引用分配到堆上。
上面的分析总结自Go FAQ-Heap and Stack
Golang里的逃逸分析
TBD
Reference
- Golang escape analysis
- Go Escape Analysis Flaws
- 变量的堆栈问题
- stack frame
- Golang逃逸分析