1. 程式人生 > >【2015/9/25】為什麼要設計堆疊?

【2015/9/25】為什麼要設計堆疊?

         昨天參加一個公司面試。面試官問的一個問題。當時只知道java中的堆疊區別。但是完全沒想過為什麼要這樣設計。

         我當時回答的是,堆儲存物件,棧儲存描述類的資訊或者函式資訊等等。但是明顯文不對題。面試官追問,那為什麼在棧中儲存物件呢?或者我們用別的資料結構去實現它,為什麼要一定要對堆疊? 

         今天百度了一下。發現了下面的答案。

設計原因有兩點:⑴棧的存取速度特別快,僅次於暫存器。當程式要在記憶體中讀寫資料時,先找到棧,再通過棧的指向到堆記憶體中進行資料的讀寫。由於不用再遍歷速度慢而且資料多的堆記憶體,所以程式的執行速度會更快。
⑵便於記憶體的回收。當程式的一些資料不用後,就會丟掉棧記憶體中相應的資料,此時以前指向的堆記憶體空間就沒有了棧的指向,變成了垃圾。這時Java虛擬機器的垃圾回收機制就會將這塊沒有棧指向的堆記憶體空間回收,供給以後的程式使用。
堆疊的用途主要是呼叫子程式時暫存斷點地址和保護(恢復)現場資料。堆疊是一種儲存部件,即資料的寫入跟讀出不需要提供地址,而是根據寫入的順序決定讀出的順序。
      這個解釋還是挺清晰的。感覺棧就是一張記錄表。裡面記錄了各種物件的地址,如果你要找物件,去棧中遍歷很快就能找到入口,但是如果在堆中遍歷大而繁瑣的物件,速度就會慢很多。