百科问答小站 logo
百科问答小站 font logo



go语言,局部变量什么时候回收? 第1页

  

user avatar   yuhengk 网友的相关建议: 
      

Go 有 escape analysis, 在编译期,它会分析你的变量是否在函数执行完毕那一刻,程序有没有可能有别的对象引用到它(所谓逃逸),如果没有,那这个变量就可以在栈上分配,完全不经过 gc. 如果它已经逃逸了,那什么时候 gc 就由不得你了。

在 go build 时加上 -gcflags='-m' 参数,它会在编译时打印什么东西 escape 了,题主的程序,不好意思,全部中招:

       ./test.go:16: j escapes to heap ./test.go:18: vec escapes to heap ./test.go:12: make([]int, 5, 5) escapes to heap     

原因其实在 fmt.Println, 你看文档,fmt.Println 接收的是 interface{}... Interface 实际上就是个数据指针+itable指针(

research.swtch.com/inte

),然后编译器就已经瞎了。所以就只好判断,这时候 j 和 vec 都 escape 了……(叫你不加 generic……)另外注意虽然这时传给 fmt.Println 的 interface{} 并不指向 j, 而是一个 j 的拷贝,但因为编译器已经傻掉,这个拷贝只能放堆上,所以这个 escape 也算在 j 头上了。

伺候 Go gc 最简单的就是少把指针传来传去少弄点零碎共享对象。除了显式指针外 interface{} 是个指针,slice 是个指针 blah blah blah. 没有显著理由优先复制传值而不是传指针,在现代机器上,复制结构往往很廉价(Go 没有复制构造函数之类的东东复制还真就是个 memory copy)。

当然最重要的,做 profiling, 找到真正要优化的点,之后像上面这种静态分析工具也能帮大忙。

大推荐 Go 核心开发者 Russ Cox 的两篇 Go data structures

research.swtch.com/goda research.swtch.com/inte



  

相关话题

  真的有人是因为喜欢科研才读研的么?如果是,乐趣在哪? 
  如何看待中科院计算所发布的“木兰”国产编程语言其实基于Python3,并非完成“自主研发”? 
  如果一门编程语言中不允许对象(或结构体)循环引用,那么用它实现什么功能会比较困难? 
  如何看待网传华为自研编程语言仓颉(char)曝光?自研编程语言有哪些作用? 
  何时使用 Protected 继承? 
  如果华为自己做手机操作系统,你对这个操作系统有什么建议? 
  游戏开发的编程算不算是 IT 行业中难度最大的? 
  “C++”读作「C 加加」,为什么“C#”不能读作「C 井」呢? 
  怎么编程实现if,不使用if关键字? 
  从语言设计的角度来看, Pascal 是一门优秀的语言吗? 

前一个讨论
为什么有些大公司技术弱爆了?
下一个讨论
如何评价雷军在红米Note3发布会上落泪?





© 2025-04-17 - tinynew.org. All Rights Reserved.
© 2025-04-17 - tinynew.org. 保留所有权利