go语言的局部变量在堆上还是栈上?

本文探讨了Go语言中的内存管理,指出Go编译器通过逃逸分析决定局部变量是在栈上还是堆上分配。与C++不同,Go语言会自动管理内存,避免内存泄漏,让程序员更专注于代码逻辑。逃逸分析确保了变量在适当的位置存储,释放了程序员对内存使用的担忧。
摘要由CSDN通过智能技术生成

在讨论之前,先看如下代码:

复制代码

 1 type treeNode struct {
 2     value int
 3     left, right *treeNode
 4 }
 5 
 6 func createNode(value int) *treeNode {
 7     return &treeNode{value:value}
 8 }
 9 
10 func main() {
11     root := createNode(10)
12     fmt.Println(root)
13 }

复制代码

上面这段代码createNode函数返回了一个局部变量的地址给main函数中的root,但是fmt.Println正常打印出来了新建的node的内容。这要是在C++中这么写,是个很典型的错误:返回局部变量的地址,该地址的内容在函数退出后会被自动释放,因为是在栈上的。

那么go语言的局部变量到底是在栈上还是堆上呢?go语言编译器会做逃逸分析(escape analysis),分析局部变量的作用域是否逃出函数的作用域,要是没有,那么就放在栈上;要是变量的作用域超出了函数的作用域,那么就自动放在堆上。所以不用担心会不会memory leak,因为go语言有强大的垃圾回收机制。这样可以释放程序员的内存使用限制,让程序员关注程序逻辑本身。

 

对于new出来的局部变量,也不是一定就放在堆上,而是根据其是否超出了函数作用域来判断是否放在堆上还是栈上。这点和C语言很不一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值