如何才能知道go程序中一个变量被分配到堆上还是栈上
2019-04-11 本文已影响0人
golang推广大使
从正确的角度来讲,你不需要知道。go语言中每一个变量只要还有对他的使用,他就会一直存在。实现选择的存储位置的是与语言的语义没有关系的。
存储位置对写高性能程序并没有影响。如果可能,Go编译器将为该函数的堆栈帧中的函数分配本地变量。但是,如果编译器在函数返回后无法证明变量未被引用,则编译器必须在垃圾收集堆上分配变量以避免悬空指针错误。此外,如果局部变量非常大,将它存储在堆而不是堆栈上可能更有意义。
在当前的编译器中,如果变量具有其地址,则该变量是堆上分配的候选变量。但是,基本的转义分析可以识别某些情况,这些变量不会超过函数的返回值并且可以驻留在堆栈上。