go 的内存逃逸

2022-04-04  本文已影响0人  wayyyy

在C/C++ 中,例如对于局部变量的分配是在栈上,在go语言中,这是不确定的,局部变量的内存分配也许发生在堆上。

package main

var a int
func foo() *int {
    a := 10
    return &a  // 在C++ 中,返回局部变量的指针是不安全的,但是在go中是安全的,因为发生了内存逃逸。
}

func main() {
    a := *foo()
}
内存逃逸影响

变量在堆上的分配和回收都比在栈上开销大的多,对于 go 这种带 GC 的语言来说,会增加 gc 压力。

如何发现内存逃逸?

go 中逃逸分析在编译阶段完成的,在 build 时添加 -gcflags="-m -l" 选项可以看内存逃逸情况。-m 会打印出逃逸分析的优化策略。-l禁止编译优化,这里主要是为了输出信息单一好看。

var a int

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

func main() {
    a = *foo()
}
# go build -gcflags="-m -l"
  ./main.go:8:5: moved to heap: a
哪些情形会发生内存逃逸?
避免内存逃逸

参考
1、https://juejin.cn/post/6952177646050639902
2、https://mp.weixin.qq.com/s/_tjDnPcdBkUpjJ80f3cGTg

上一篇下一篇

猜你喜欢

热点阅读