血衫的一己之见 头像

消息来源频道

血衫的一己之见

@bgming

频道1,514 位成员公开可见0 人在线

分享动漫与技术

成员规模1,514 位成员
在线情况0 人在线
消息总数6,552 条消息
浏览量总数22,190 次浏览

在这个频道里搜索消息……

t.me/bgming

只要有对变量的引用,变量就会存在,而它存储的位置与语言的语义无关。如果可能,变量会被分配到其函数的栈,但如果编译器无法证明函数返回之后变量是否仍然被引用,就必须在堆上分配该变量,采用垃圾回收机制进行管理,从而避免指针悬空。此外,局部变量如果非常大,也会存在堆上。
在编译器中,如果变量具有地址,就作为堆分配的候选,但如果逃逸分析可以确定其生存周期不会超过函数返回,就会分配在栈上。
总之,分配在堆还是栈完全由编译器确定。
所以 Go 里变量分配在由编译器决定,我们虽然无法通过变量的类型判断它的存储位置,但可以通过打印程序的汇编代码来查看,主要使用 go tool compile 命令
#golang