Go 中的所有变量都是在堆上分配的吗?

我是 Go 的新手,发现返回函数中定义的局部变量的地址是可以的。这在 C 中显然是不可能的,因为局部变量在堆栈中。

所以我只是想知道为什么可以在 Go 中做到这一点?在 Go 中,局部变量在堆中?由于分配堆内存比堆栈昂贵得多,它会影响性能吗?Go中是否可以在堆栈中分配局部变量?或者实际上 Go 中有堆栈内存?


扬帆大鱼
浏览 281回答 1
1回答

猛跑小猪

我怎么知道一个变量是分配在堆上还是堆栈上?从正确性的角度来看,您不需要知道。只要有对它的引用,Go 中的每个变量就存在。实现选择的存储位置与语言的语义无关。存储位置确实对编写高效程序有影响。如果可能,Go 编译器将在该函数的堆栈帧中分配函数的局部变量。但是,如果编译器在函数返回后无法证明该变量未被引用,则编译器必须在垃圾收集堆上分配该变量以避免悬空指针错误。此外,如果局部变量非常大,将其存储在堆上而不是堆栈上可能更有意义。在当前的编译器中,如果一个变量的地址被占用,则该变量是在堆上分配的候选对象。然而,一个基本的逃逸分析识别出一些情况,当这些变量在函数返回后不会存活并且可以驻留在堆栈中。TLDR:你不应该在意。Go 会为你处理分配。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go