淺談 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。