Eri*_*ric 4 memory-management heap-memory go
我是Go的新手,发现可以返回函数中定义的局部变量的地址.这显然在C中是不可能的,因为局部变量在堆栈中.
所以我只是想知道为什么在Go中可以做到这一点?在Go中,局部变量在堆中?它会影响性能,因为分配堆内存比堆栈贵吗?可以在Go中在堆栈中分配局部变量吗?或者实际上Go中有堆栈内存?
Den*_*ret 14
我如何知道变量是在堆还是堆栈上分配?
从正确的角度来看,您不需要知道.Go中的每个变量都存在,只要有对它的引用即可.实现选择的存储位置与语言的语义无关.
存储位置确实会影响编写高效的程序.如果可能,Go编译器将为该函数的堆栈帧中的函数分配本地变量.但是,如果编译器在函数返回后无法证明变量未被引用,则编译器必须在垃圾收集堆上分配变量以避免悬空指针错误.此外,如果局部变量非常大,将它存储在堆而不是堆栈上可能更有意义.
在当前的编译器中,如果变量具有其地址,则该变量是堆上分配的候选变量.但是,基本的转义分析可以识别某些情况,这些变量不会超过函数的返回值并且可以驻留在堆栈上.
TLDR:你不应该在乎.Go负责为您分配资源.