我是Go的新手,发现可以返回函数中定义的局部变量的地址。这显然在C中是不可能的,因为局部变量在堆栈中。
所以我只是想知道为什么在Go中这样做是可以的?在Go中,局部变量在堆中?它会影响性能,因为分配堆内存比堆栈贵吗?可以在Go中在堆栈中分配局部变量吗?或者实际上Go中有堆栈内存?
答案 0 :(得分:13)
There's a very clear answer to that question in the FAQ:
TLDR:你不应该关心。 Go负责为您分配。我如何知道是否在堆上分配变量 堆栈吗
从正确的角度来看,你不需要知道。每个变量 只要有引用就存在于Go中。存储 实现选择的位置与语义无关 语言。
存储位置确实会影响写入效率 程式。如果可能,Go编译器将分配变量 是函数的堆栈框架中的函数的本地函数。但是,如果 编译器无法证明变量未被引用 函数返回,然后编译器必须分配变量 垃圾收集堆,以避免悬空指针错误。另外,如果 局部变量非常大,存储它可能更有意义 在堆而不是堆栈上。
在当前的编译器中,如果变量的地址被采用,那么 变量是堆上分配的候选者。但是,基本的 转义分析可以识别某些情况,而这些变量则不会 过了函数的返回,可以驻留在堆栈上。