亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 中的所有變量都是在堆上分配的嗎?

Go 中的所有變量都是在堆上分配的嗎?

Go
揚帆大魚 2021-10-25 20:05:55
我是 Go 的新手,發現返回函數中定義的局部變量的地址是可以的。這在 C 中顯然是不可能的,因為局部變量在堆棧中。所以我只是想知道為什么可以在 Go 中做到這一點?在 Go 中,局部變量在堆中?由于分配堆內存比堆棧昂貴得多,它會影響性能嗎?Go中是否可以在堆棧中分配局部變量?或者實際上 Go 中有堆棧內存?
查看完整描述

1 回答

?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

我怎么知道一個變量是分配在堆上還是堆棧上?

從正確性的角度來看,您不需要知道。只要有對它的引用,Go 中的每個變量就存在。實現選擇的存儲位置與語言的語義無關。

存儲位置確實對編寫高效程序有影響。如果可能,Go 編譯器將在該函數的堆棧幀中分配函數的局部變量。但是,如果編譯器在函數返回后無法證明該變量未被引用,則編譯器必須在垃圾收集堆上分配該變量以避免懸空指針錯誤。此外,如果局部變量非常大,將其存儲在堆上而不是堆棧上可能更有意義。

在當前的編譯器中,如果一個變量的地址被占用,則該變量是在堆上分配的候選對象。然而,一個基本的逃逸分析識別出一些情況,當這些變量在函數返回后不會存活并且可以駐留在堆棧中。

TLDR:你不應該在意。Go 會為你處理分配。


查看完整回答
反對 回復 2021-10-25
  • 1 回答
  • 0 關注
  • 306 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號