【问题标题】:Why are functions able to return a local variable? [closed]为什么函数能够返回局部变量? [关闭]
【发布时间】:2019-07-31 02:08:54
【问题描述】:

这只是引起了我的好奇心。

虽然我们知道在 C/C++ 中返回在函数中声明的局部非指针类型变量是非法的,但在 Golang 中这是完全合法的。为什么呢?编译器是否根据变量的使用情况来决定是否在编译时将变量分配给栈/堆?

例如

func getVal() *int {
    x := 1
    return &x
}

【问题讨论】:

标签: go


【解决方案1】:

是的,没错。编译器执行称为“转义分析”的操作,以确定变量的范围是否超出函数的范围,在这种情况下,它会自动放置在堆上。有关更多详细信息,请参阅http://www.agardner.me/golang/garbage/collection/gc/escape/analysis/2015/10/18/go-escape-analysis.html,尽管我相信现在更现代的 go 版本比那里描述的要聪明一些。

官方 Go 常见问题解答中也提到了这一点(在我看来有点令人困惑):https://golang.org/doc/faq#stack_or_heap

【讨论】:

  • 有趣。感谢分享。
猜你喜欢
  • 1970-01-01
  • 2019-11-08
  • 2013-09-27
  • 2015-10-04
  • 2021-01-26
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多