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

时间:2015-08-03 12:10:55

标签: memory-management go heap-memory

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

所以我只是想知道为什么在Go中这样做是可以的?在Go中,局部变量在堆中?它会影响性能,因为分配堆内存比堆栈贵吗?可以在Go中在堆栈中分配局部变量吗?或者实际上Go中有堆栈内存?

1 个答案:

答案 0 :(得分:13)

There's a very clear answer to that question in the FAQ

  

我如何知道是否在堆上分配变量   堆栈吗

     

从正确的角度来看,你不需要知道。每个变量   只要有引用就存在于Go中。存储   实现选择的位置与语义无关   语言。

     

存储位置确实会影响写入效率   程式。如果可能,Go编译器将分配变量   是函数的堆栈框架中的函数的本地函数。但是,如果   编译器无法证明变量未被引用   函数返回,然后编译器必须分配变量   垃圾收集堆,以避免悬空指针错误。另外,如果   局部变量非常大,存储它可能更有意义   在堆而不是堆栈上。

     

在当前的编译器中,如果变量的地址被采用,那么   变量是堆上分配的候选者。但是,基本的   转义分析可以识别某些情况,而这些变量则不会   过了函数的返回,可以驻留在堆栈上。

TLDR:你不应该关心。 Go负责为您分配。