Golang中變量的分配位置是堆or棧


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

       正確的觀點是,你不需要知道。go語言中的每一個變量,它的生命周期和引用它的周期一樣長。該語言的語義和實現時選擇的存儲位置,是沒有關系的。

       在編寫高效率的程序時,存儲位置的確會有影響。如果可以,go語言編譯器將會分配函數的局部變量到函數的棧幀上。然而,如果編譯器不能證實局部變量在函數返回后,不會再被引用,編譯器將必須分配該變量到垃圾回收堆上,以避免出現懸掛指針錯誤。如果一個局部變量非常大,那么存儲在堆上比存儲在棧上也更加合理。

       在當前的編譯器里,如果一個變量的地址被調用了,這個變量將會候選分配在堆上。然而,一個基本轉義分析會識別一些情況。在這些情況里,變量不會存活到函數返回,這些變量將分配到棧上。

 

例如下面這個函數是正確的,Go語言中沒有C++中的構造函數,對象的創建一般交給一個全局的創建函數來完成:

func NewRect(x, y, width, height float64) *Rect {

return &Rect{x, y, width, height}

}

注意,這里與C/C++不同的是,返回一個局部變量的地址在Go語言中是絕對沒有問題的;變量關聯的存儲在函數返回之后依然存在。

更直接的說,在Go語言中,如果一個局部變量在函數返回后仍然被使用,這個變量會從heap,而不是stack中分配內存。

結論:

Go 編譯器自行決定變量分配在堆棧或堆上,以保證程序的正確性。參考https://blog.csdn.net/guyan0319/article/details/85236313


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM