在討論之前,先看如下**:
1 type treenode struct56 func createnode(value int) *treenode 8}
910func main()
上面這段**createnode函式返回了乙個區域性變數的位址給main函式中的root,但是fmt.println正常列印出來了新建的node的內容。這要是在c++中這麼寫,是個很典型的錯誤:返回區域性變數的位址,該位址的內容在函式退出後會被自動釋放,因為是在棧上的。
那麼go語言的區域性變數到底是在棧上還是堆上呢?go語言編譯器會做逃逸分析(escape analysis),分析區域性變數的作用域是否逃出函式的作用域,要是沒有,那麼就放在棧上;要是變數的作用域超出了函式的作用域,那麼就自動放在堆上。所以不用擔心會不會memory leak,因為go語言有強大的垃圾**機制。這樣可以釋放程式設計師的記憶體使用限制,讓程式設計師關注程式邏輯本身。
對於new出來的區域性變數,也不是一定就放在堆上,而是根據其是否超出了函式作用域來判斷是否放在堆上還是棧上。這點和c語言很不一樣。
RAM中區域性變數在棧中分配
無os時,ram的使用可以分為資料 棧和堆區域 有os時,將ram分成若干個段,每個任務分配乙個段,用於各自的資料 棧和堆區域。區域性變數 local variable 是指作用域和生命週期都侷限在所在函式或過程範圍內的變數,它是相對於全域性變數 global variable 而言的。編譯器在為區...
如何理解成員變數在堆內,區域性變數在棧內?
成員變數在堆記憶體裡,區域性變數在棧記憶體裡。基礎型別 我有疑惑 既然成員變數存在於物件中,物件存在於堆中,所以成員變數存在於堆中。那麼按照這樣的推理,區域性變數存在於方法中,而方法存在於物件中,物件存在於堆中,那是不是可以說區域性變數存在於堆中?解決思想 當物件new 出來,實體存在於堆,物件的成...
成員變數在堆記憶體裡,區域性變數在棧記憶體裡
成員變數在堆記憶體裡,區域性變數在棧記憶體裡。基礎型別 我有疑惑 既然成員變數存在於物件中,物件存在於堆中,所以成員變數存在於堆中。那麼按照這樣的推理,區域性變數存在於方法中,而方法存在於物件中,物件存在於堆中,那是不是可以說區域性變數存在於堆中?解決思想 當物件new出來,實體存在於堆,物件的成員...