iOS中堆和棧的區別

管理方式:程序員

對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來說,釋放工做有程序員控制,容易產生memory Leak數據結構

申請大小:函數

棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存區域。這句話的意思是棧頂上的地址和棧的最大容量是系統預先規定好的,在Windows下,棧的大小是2M(也有的說1M,總之是編譯器肯定的一個常數),若是申請的空間超過了棧的剩餘空間時候,就overflow。所以,能得到棧的空間較小。spa

堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是因爲系統是用鏈表來存儲的空閒內存地址的,天然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大笑受限於計算機系統中有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大。隊列

碎片的問題:內存

對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。對於棧來說,則不會存在這個問題,由於棧是先進後出的隊列,他們是如此的一一對應,以致於永遠都不可能有一個內存快從棧中彈出。編譯器

 

分配方式:編譯

堆都是動態分配的,沒有靜態分配的堆。棧有兩種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,好比局部變量的分配。動態分配是有alloc函數進行分配的,可是棧的動態分配和堆是不一樣的,他的動態分配由編譯器進行釋放,無需咱們手工實現。效率

分配效率:變量

棧是機器系統提供的數據結構,計算機會在底層堆棧提供支持,分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,他的機制是很複雜的。

相關文章
相關標籤/搜索