Stack 與 Heap 有何差別
程式設計相關的行業,經常有面試人詢問這個問題:「 Stack 與 Heap 有何差別」。以我的想法,未經思考的時候,大概會回答說,我知道 Stack 是什麼,因為在資料結構課程有學過,但是,關於 Heap ,則是在一些程式語言搭配的虛擬環境 (VM)裡頭有聽說過。可是,像我一樣很熟悉填空題、問答題,卻不熟悉申論題的人,到底要怎麼談呢?
什麼叫做 ……
什麼叫做 Stack ? Stack 是一種讓資料後進先出、或說讓資料先進後出的資料組織方式。資料存放於 Stack 的先後順序非常符合程式運作的格式:有個 function 先運作, function 的參數變數與傳回值指標都存放在 Stack 頂端,然後這個 function 呼叫另一個 function ,接著新呼叫的 function 將它的參數變數與傳回值指標包裹為一個包(稱為 frame ),然後將這個包壓在 Stack 的頂端。後來,當那個新呼叫的 function 執行完畢,系統會將 Stack 頂端,對應給那個 function 的 frame 退出,同時,程式回到前一個 function,這個 function 由 Stack 頂端的 frame 取回它的資料。
什麼叫做 Heap ? Heap 是一種保留一大塊夠用的記憶題,讓程式方便配置它所需要的資料。真的顧名思義, Heap 就是堆放空間的意思。程式可以有許多變數,而程式中所包含的各種變數所包含的資料,可以擺放在 Heap 的任何位置,並且,每一筆資料的大小都可以變大或變小。在 Heap 中的每一筆資料,做為一個物件,可以附掛許多筆參考鏈路 (reference) ,而假如有一筆資料已經不受任何參考時,它之後會受 Garbage Collector 清除,而釋出所占用的空間。 Heap 的管理方式,各種系統有些微不同。可能有某個系統,以配置陣列為例,要擴大一個陣列的配置空間時,它把舊的配置空間取消而留待 Garbage Collector 清除,然後,在 Heap 另外找一塊連續、完整的區域,來配置新的陣列儲存空間,於是這個陣列獲得新的儲存位置,以及新的資料大小。
Stack 與 Heap 都是在記憶體上組織資料的方式。
所以差別在哪裡?
簡單說, Stack 是拿來給程式呼叫 function 時存放 function 資料用的,而 Heap 是用來存放並且管理,程式全部所需要用到的變數與資料。