iOS堆疊記憶體區別

2022-07-29 06:48:08 字數 924 閱讀 2463

堆和棧的區別:

· 1> 堆空間的記憶體是動態分配的,一般存放物件,並且需要手動釋放記憶體。

· 2> 棧空間的記憶體由系統自動分配,一般存放區域性變數等,不需要手動管理記憶體。

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

管理方式:

對於棧來講,由編譯器自動管理,無需我們手動控制。

對於堆來說,釋放工作由程式設計師控制,容易產生memory warning。

申請大小:

棧:在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體區域.即棧頂的位址和棧的最大容量是系統預先規好的。棧的大小是1m,如果申請空間超過棧的剩餘空間時,將提示overflow.因此,能從棧獲得的空間較小。

堆:堆是向高位址擴充套件的資料結構,是不連續的記憶體區域.這是因為系統是用鍊錶來儲存空閒記憶體位址的,自然是不連續的,而鍊錶的遍歷方向是由低位址向高位址.堆得大小受限於計算機系統中有效地虛擬記憶體.由此可見,堆獲得的空間比較靈活,也比較大。

碎片問題:

對於堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低。

對於棧來講,則不會存在這個問題,因為棧是先進後出得佇列,它們是如此的一一對應,以至於永遠都不可能有乙個記憶體塊從棧中間彈出。

分配方式:

堆都是動態分配的,沒有靜態分配的堆。

棧有兩種分配方式:靜態分配和動態分配.靜態分配是編譯器完成的,比如區域性變數的分配.動態分配由alloc函式進行分配,但是棧的動態分配和堆是不同的,它的動態分配是由編譯器進行釋放,無需我們手工實現。

分配效率:

棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。

堆則是c/c++函式庫提供的,它的機制是很複雜的。

記憶體四區之堆疊區別

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...

堆,棧,堆疊的區別

乙個程式一般分為3段 text段,data段,bss段 text段 就是放程式 的,編譯時確定,唯讀,data段 存放在編譯階段 而非執行時 就能確定的資料,可讀可寫 就是通常所說的靜態儲存區,賦了初值的全域性變數和靜態變數存放在這個區域,常量也存放在這個區域 bss段 定義而沒有賦初值的全域性變數...

資料結構的堆疊與記憶體中堆疊的區別

隨筆 20 文章 0 原文 在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式...