1. 程式人生 > >堆和棧的個人理解

堆和棧的個人理解

在瞭解堆和棧的概念之前,首先明確下資料型別的分類。

  • 基本資料型別:Number、String、Boolean、undefined、null
  • 引用資料型別:Object
    其中基本資料型別存放在棧中,而引用資料型別存放在堆和棧中,那麼堆和棧到底有什麼區別呢?先看下百度百科的解釋。

堆疊空間分配
棧:由作業系統自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。
堆: 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回收,分配方式倒是類似於連結串列。

堆疊快取方式
棧使用的是一級快取, 他們通常都是被呼叫時處於儲存空間中,呼叫完畢立即釋放。
堆則是存放在二級快取中,生命週期由虛擬機器的垃圾回收演算法來決定。所以呼叫這些物件的速度要相對來得低一些。

堆疊資料結構區別
堆(資料結構):堆可以被看成是一棵樹,如:堆排序。
棧(資料結構):一種先進後出的資料結構。

資料型別的訪問模式


比如上方的程式碼,將a的值賦給b後,改變a的值,b並不會隨之改變。
個人理解:由於基本資料型別存放在棧中,因此可以將a和b看成兩個相互獨立的變數,改變一個值對另一個變數並不會產生影響。而且在棧中存放的記憶體大小是固定的。

引用資料型別則不然,把color1的值複製給color2後,改變其中任何一個變數的屬性,另一個變數都會隨之改變。由於引用資料型別複製的並不是屬性本身的值,而是該屬性存放的地址,地址存放在棧中,屬性值存放在堆中,改變變數屬性實際上就是改變棧中的屬性值,但是地址是不變的,而此時兩個變數所指的地址相同,因此改變一個屬性,另一個就會隨之改變。


記憶體地址大小的固定的,因此可以將記憶體地址儲存在棧記憶體中。 這樣,當查詢引用型別的變數時, 先從棧中讀取記憶體地址, 然後再通過地址找到堆中的值。因為系統不知道需要多大記憶體存放資料,所以程式自己申請,這樣就分配在堆裡面。