ToB企服应用市场:ToB评测及商务社交产业平台

标题: golang 什么是内存逃逸? [打印本页]

作者: 鼠扑    时间: 2024-7-14 01:31
标题: golang 什么是内存逃逸?
什么是内存逃逸?

golang程序变量会携带有一组校验数据,用来证明它的整个生命周期是否在运行时完全可知。如果变量通过了这些校验,它就可以在栈上分配。否则就说它 逃逸 了,必须在堆上分配。
能引起变量逃逸到堆上的典范情况:

  1. package main
  2. import "fmt"
  3. type A struct {
  4. s string
  5. }
  6. // 这是上面提到的 "在方法内把局部变量指针返回" 的情况
  7. func foo(s string) *A {
  8. a := new(A)
  9. a.s = s
  10. return a //返回局部变量a,在C语言中妥妥野指针,但在go则ok,但a会逃逸到堆
  11. }
  12. func main() {
  13. a := foo("hello")
  14. b := a.s + " world"
  15. c := b + "!"
  16. fmt.Println(c)
  17. }
复制代码
执行go build -gcflags=-m main.go
  1. go build -gcflags=-m main.go
  2. # command-line-arguments
  3. ./main.go:7:6: can inline foo
  4. ./main.go:13:10: inlining call to foo
  5. ./main.go:16:13: inlining call to fmt.Println
  6. /var/folders/45/qx9lfw2s2zzgvhzg3mtzkwzc0000gn/T/go-build409982591/b001/_gomod_.go:6:6: can inline init.0
  7. ./main.go:7:10: leaking param: s
  8. ./main.go:8:10: new(A) escapes to heap
  9. ./main.go:16:13: io.Writer(os.Stdout) escapes to heap
  10. ./main.go:16:13: c escapes to heap
  11. ./main.go:15:9: b + "!" escapes to heap
  12. ./main.go:13:10: main new(A) does not escape
  13. ./main.go:14:11: main a.s + " world" does not escape
  14. ./main.go:16:13: main []interface {} literal does not escape
  15. <autogenerated>:1: os.(*File).close .this does not escape
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4