Loading... 几个底层知识点 1、栈内存分配和释放非常快 2、堆内存需要依靠Go垃圾回收(占CPU) 3、通过逃逸分析,可以尽量把那些不需要分配到堆上的变量直接分配到栈上 Go的主要目的并不希望程序员关注分配,而是通过编译时的代码分析自动决定 ## 逃逸分析是什么 通俗来讲,当一个对象的指针被多个方法或线程引用时,就称这个指针发生了逃逸 逃逸分析呢,就是Go在编译阶段确定一个变量它是分配在对堆还是栈的一种行为。 ## 逃逸分析有什么用 通过逃逸分析,可以尽量把那些不需要分配到堆上的变量直接分配到栈上,堆上的变量少了,会减轻分配堆内存的开销,同时也会减少gc的压力,提高程序的运行速度。 ## 逃逸分析是怎么完成的 编译器会根据变量是否被外部引用来决定是否逃逸: > 1.如果函数外部没有引用,则优先放到栈中; > > 2.如果函数外部存在引用,则必定放到堆中; ## 如何确定逃逸分析 使用go命令: ``` go build -gcflags '-m -l' main.go ``` -m 用于输出编译器的优化细节(包括使用逃逸分析这种优化),使用-N来挂u关闭编译器优化,而-l则用于禁用foo函数的内联优化,防止逃逸被编译器通过内联优化彻底抹除。 ## 三种常见情况 1.局部变量原本应该在栈中分配,在栈中回收。由于返回时被外部引用 ```go func test() []int{ a := []int{1,2,3} a[1] = 4 return a } ``` 2.interfaces 3.struct是否使用指针 最后修改:2022 年 06 月 30 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏