参考:Golang内存分配逃逸分析 - jimshi - 博客园
GO语言变量逃逸分析 - Go语言中文网 - Golang中文社区
总结下,就是:
1. 堆和栈
之前写c++的时候,栈是各种局部变量,函数结束就自动释放;堆就是使用new和malloc分配的,需要rd去关注啥时候分配,啥时候释放。在栈上分配内存比较快,而且回收也快,在堆上分配就耗费的资源比较多。而且,在栈上面分配的,函数结束后就自动回收了,只有全局的栈上的变量和堆上的变量,才需要GC回收,减少堆上分配内存的同时,也减轻了gc的压力。
所以go就希望,能尽可能多的在栈上面分配资源。那go是怎么做的呢?
func F() {
temp := make([]int, 0, 20)
...
}
就比如上面这种,虽然是手动执行了make来分配内存,正常来说应该在堆上,但是实际上是在栈上面。但是也不是所有的局部变量都能分配到栈上。
func F() []int{
a := make([]int, 0, 20)