iOS堆棧內存區別

堆和棧的區別:程序員

· 1> 堆空間的內存是動態分配的,通常存放對象,而且須要手動釋放內存。markdown

· 2> 棧空間的內存由系統自動分配,通常存放局部變量等,不須要手動管理內存。數據結構

接下來我將從如下幾個方面來闡述堆與棧的區別;函數

管理方式: 對於棧來說,由編譯器自動管理,無需咱們手動控制。 對於堆來講,釋放工做由程序員控制,容易產生memory warning。 申請大小: 棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存區域.即棧頂的地址和棧的最大容量是系統預先規好的。棧的大小是1M,若是申請空間超過棧的剩餘空間時,將提示overflow.所以,能從棧得到的空間較小。 堆:堆是向高地址擴展的數據結構,是不連續的內存區域.這是由於系統是用鏈表來存儲空閒內存地址的,天然是不連續的,而鏈表的遍歷方向是由低地址向高地址.堆得大小受限於計算機系統中有效地虛擬內存.因而可知,堆得到的空間比較靈活,也比較大。 碎片問題: 對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。 對於棧來說,則不會存在這個問題,由於棧是先進後出得隊列,它們是如此的一一對應,以致於永遠都不可能有一個內存塊從棧中間彈出。 分配方式: 堆都是動態分配的,沒有靜態分配的堆。 棧有兩種分配方式:靜態分配和動態分配.靜態分配是編譯器完成的,好比局部變量的分配.動態分配由alloc函數進行分配,可是棧的動態分配和堆是不一樣的,它的動態分配是由編譯器進行釋放,無需咱們手工實現。 分配效率: 棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。 堆則是C/C++函數庫提供的,它的機制是很複雜的。
相關文章
相關標籤/搜索