page contents

Go 语言的局部变量分配在栈上还是堆上?

轩辕小不懂 发布于 2021-09-10 14:39
阅读 654
收藏 0
分类:Golang
1908
Nen
Nen
- 程序员

由编译器决定。Go 语言编译器会自动决定把一个变量放在栈还是放在堆,编译器会做逃逸分析(escape analysis),当发现变量的作用域没有超出函数范围,就可以在栈上,反之则必须分配在堆上。

func foo() *int {

v := 11

return &v

}


func main() {

m := foo()

println(*m) // 11

}

foo() 函数中,如果 v 分配在栈上,foo 函数返回时,&v 就不存在了,但是这段函数是能够正常运行的。Go 编译器发现 v 的引用脱离了 foo 的作用域,会将其分配在堆上。因此,main 函数中仍能够正常访问该值。

请先 登录 后评论