淺談 Heap 與 Stack

記憶體中的 Heap 與 Stack

在記憶體中,負責動態分配記憶體的區塊有兩個,一個是 Stack ,另一個是 Heap。下面我們來稍微簡單瞭解一下兩者的差距。

Heap Stack
結構 基於 LinkedList、Array、Tree。 Stack
特點 手動分配大小。隨時釋放空間,數據進出無先後順序 自動分配大小,自動釋放記憶體空間,數據先進先出。
存放對象 reference type如 class。引用計數、變數類型等訊息 reference value如 struct,enum,int。 function返回值,區域變數
操作 查詢之後分配/釋放,之後再做結合,複雜度高 依靠Stack Pointer移動來分配/釋放,複雜度低
執行緒 共享,多執行緒不安全 獨享,多執行緒安全

總結

在 WWDC 中,Apple曾經提到 Heap的操作複雜度要遠遠超過Stack。所以大家在選擇資料結構時,盡量選擇像 struct 這種會儲存在 Stack 上的數據類型,而不是選擇 Heap類型。

雖然現在 已經有 ARC 幫我們自動處理記憶體的分配與釋放的問題了,然而 Apple 依舊推薦使用像是 struct 和值類型, 是因為 Stack 的性能很高。雖然 Heap 可以更自由跟靈活的分配記憶體,但相對就要付出複雜度操作較高的代價。

如果想要更進一步了解 Heap 的操作,可以參考 Swift 開發中,為什麼要遠離 Heap