Stack vs Heap

記憶體管理與效能

HUA YU TSENG
2 min readMar 12, 2020

Stack(堆疊/棧):
Value Type,由編譯器自動分配釋放,存放函式的引數值,區域性變數等值。“Stack ”是後進先出(LIFO )結構,系統使用Stack 段中的指標值訪問Heap 段中的物件。如果Stack 物件的指標沒有了,則Heap 中的物件就不能訪問。這也是記憶體洩露的原因。

特性:
建立速度快,管理簡單,有嚴格的生命週期。建立時分配的記憶體長度固定且不可修改。建立時是哪個函式建立的,它的owner 就一直是它。不像Heap 物件那樣有多個Owner。其操作方式類似於資料結構中的棧。擁有單一Owner。

舉例:block中的_NSConcreteStackBlock,記憶體管理屬於Stack,當函式返回時會被銷燬。

Heap(堆積/堆):
Reference Type,由程式設計師分配釋放,若程式設計師不釋放,則可能會引起記憶體洩漏。注堆和資料結構中的堆疊不一樣,其類是與連結串列。

特性:
不會如 Stack 自動銷毀物件,必須靠外部作業才能銷毀物件,iOS 的 ARC 就是負責這項工作。參考數是由 ARC 所追蹤的,當它變為零時,物件就會被重新分配。因此,Heap整個過程(配置、追蹤參考、以及重新配置)相對 Stack 來說是比較慢的,所以數值型別會比參考型別快(意即傳值時使用Stack效能較高)。

舉例:
block中的_NSConcreteMallocBlock,記憶體管理屬於Heap,當引用計數為0時會被銷燬。

效能:
Stack是作業系統提供的數據結構,系統底層會分配專門的寄存器儲存Stack的地址,寫入寫出都有專門的指令執行,整體來說Stack的效率較高

Heap的機制複雜,由C/C++函數庫所提供,簡單來說當分配Heap記憶體的時候,該函數庫有一套演算法去搜索記憶體位置中足夠的空間若空間不足,又可能調用系統功能增加數據段的內存空間,然後做出回應,再則ARC機制會計算該物件的reference count,當reference count歸零時物件就會被重新分配,因此Heap的效能比Stack要低。

--

--

HUA YU TSENG

I am Red, an iOS developer, I have hands on experience in iOS, Flutter, familiar with RxSwift Moya Unit/UI testing and Gitlab-CI.