局部變量分配在棧上還是堆上?
大家好,我是明哥。
本專欄內容,已經上傳 github:https://github.com/iswbm/golang-interview
請大家幫幫忙去點個小 ??,在那里我對題庫進行了分類整理。
本篇問題:局部變量分配在棧上還是堆上?
# 什么是堆內存和棧內存?
根據內存管理(分配和回收)方式的不同,可以將內存分為 堆內存 和 棧內存。
那么他們有什么區別呢?
堆內存:由內存分配器和垃圾收集器負責回收
棧內存:由編譯器自動進行分配和釋放
一個程序運行過程中,也許會有多個棧內存,但肯定只會有一個堆內存。
每個棧內存都是由線程或者協程獨立占有,因此從棧中分配內存不需要加鎖,并且棧內存在函數結束后會自動回收,性能相對堆內存好要高。
而堆內存呢?由于多個線程或者協程都有可能同時從堆中申請內存,因此在堆中申請內存需要加鎖,避免造成沖突,并且堆內存在函數結束后,需要 GC (垃圾回收)的介入參與,如果有大量的 GC 操作,將會吏程序性能下降得歷害。
# 局部變量是從哪里分配的?
在函數里聲明定義的變量,我們稱之為局部變量。
一般來說,局部變量的作用域僅在該函數中,當函數返回后,所有局部變量所占用的內存空間都將被收回,對于這類變量,都是從棧上分配內存空間,這一點大家應該是沒有爭議的。
可有一種局部變量,比較特殊。
這種局部變量,雖然在函數里聲明定義,但是在函數外還會持續的使用。
對于這類局部變量,顯然我們是不希望函數退出后將其銷毀的。
那怎么辦呢?可以從堆區分配內存空間給這類局部變量。
不過這個事實其實不用程序員操心,Go 的編譯器會自行判斷做優化的。但我們仍然需要知道這個知識點(因為面試會問哈哈)
本文轉載自微信公眾號「Go編程時光」,可以通過以下二維碼關注。轉載本文請聯系Go編程時光公眾號。