堆和棧的區別:
· 1> 堆空間的記憶體是動態分配的,一般存放物件,並且需要手動釋放記憶體。
· 2> 棧空間的記憶體由系統自動分配,一般存放區域性變數等,不需要手動管理記憶體。
接下來我將從以下幾個方面來闡述堆與棧的區別;
管理方式:
對於棧來講,由編譯器自動管理,無需我們手動控制。
對於堆來說,釋放工作由程式設計師控制,容易產生memory warning。
申請大小:
棧:在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體區域.即棧頂的位址和棧的最大容量是系統預先規好的。棧的大小是1m,如果申請空間超過棧的剩餘空間時,將提示overflow.因此,能從棧獲得的空間較小。
堆:堆是向高位址擴充套件的資料結構,是不連續的記憶體區域.這是因為系統是用鍊錶來儲存空閒記憶體位址的,自然是不連續的,而鍊錶的遍歷方向是由低位址向高位址.堆得大小受限於計算機系統中有效地虛擬記憶體.由此可見,堆獲得的空間比較靈活,也比較大。
碎片問題:
對於堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低。
對於棧來講,則不會存在這個問題,因為棧是先進後出得佇列,它們是如此的一一對應,以至於永遠都不可能有乙個記憶體塊從棧中間彈出。
分配方式:
堆都是動態分配的,沒有靜態分配的堆。
棧有兩種分配方式:靜態分配和動態分配.靜態分配是編譯器完成的,比如區域性變數的分配.動態分配由alloc函式進行分配,但是棧的動態分配和堆是不同的,它的動態分配是由編譯器進行釋放,無需我們手工實現。
分配效率:
棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。
堆則是c/c++函式庫提供的,它的機制是很複雜的。
堆和棧區別
一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...
堆和棧區別
管理方式 棧由編譯器自動管理 堆由程式設計師控制,使用方便,但易產生記憶體洩露。生長方向 棧向低位址擴充套件 即 向下生長 是連續的記憶體區域 堆向高位址擴充套件 即 向上生長 是不連續的記憶體區域。這是由於系統用鍊錶來儲存空閒記憶體位址,自然不連續,而鍊錶從低位址向高位址遍歷。空間大小 棧頂位址和...
堆和棧區別
一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...