我是 Go 的新手,發現返回函數中定義的局部變量的地址是可以的。這在 C 中顯然是不可能的,因為局部變量在堆棧中。所以我只是想知道為什么可以在 Go 中做到這一點?在 Go 中,局部變量在堆中?由于分配堆內存比堆棧昂貴得多,它會影響性能嗎?Go中是否可以在堆棧中分配局部變量?或者實際上 Go 中有堆棧內存?
1 回答

猛跑小豬
TA貢獻1858條經驗 獲得超8個贊
我怎么知道一個變量是分配在堆上還是堆棧上?
從正確性的角度來看,您不需要知道。只要有對它的引用,Go 中的每個變量就存在。實現選擇的存儲位置與語言的語義無關。
存儲位置確實對編寫高效程序有影響。如果可能,Go 編譯器將在該函數的堆棧幀中分配函數的局部變量。但是,如果編譯器在函數返回后無法證明該變量未被引用,則編譯器必須在垃圾收集堆上分配該變量以避免懸空指針錯誤。此外,如果局部變量非常大,將其存儲在堆上而不是堆棧上可能更有意義。
在當前的編譯器中,如果一個變量的地址被占用,則該變量是在堆上分配的候選對象。然而,一個基本的逃逸分析識別出一些情況,當這些變量在函數返回后不會存活并且可以駐留在堆棧中。
TLDR:你不應該在意。Go 會為你處理分配。
- 1 回答
- 0 關注
- 306 瀏覽
添加回答
舉報
0/150
提交
取消