堆和棧的區別

2022-05-08 09:48:11 字數 726 閱讀 5224

1:分配方式和**方式

棧得分配方式有兩種,分別是靜態分配和動態分配,無論是哪一種方式,棧空間的**都是由作業系統處理的。即程式設計師不需要對棧空間進行處理,作業系統會幫助我們**棧空間。

堆得分配方式只有動態分配。堆中分配的空間,需要程式設計師自己去釋放。如果沒有釋放,會造成記憶體洩露。

2:大小以及結構

棧在計算機中是一段連續的空間,既然是連續空間,其空間大小必然不會太大。通常情況下,棧的空間是2m。倘若程式所占用的棧空間超過2m,就會發生棧溢位的錯誤。比如,太深層次的遞迴就容易造成棧溢位。

堆在計算機中的儲存方式類似於鍊錶,不是一段連續的空間。實際上,堆是將多個空閒的空間用鍊錶連線在一起。因此,堆得大小是不確定的,而且,堆得空間要比棧大很多。當需要使用堆中的空間時,堆會從煉表頭開始查詢,直至查詢到某乙個空閒塊的空間是大於等於所需要的空間,然後將該空閒塊分配。倘若有剩下的空間,剩下的空間會作為乙個單獨的空間塊,並且由鍊錶連線起來。

3:碎片問題

根據第二個不同點,很容易知道在使用堆時是有空間碎片的。而棧不存在這個問題,因為棧是直接分配的,倘若需要的空間大於剩餘的棧空間,直接報棧溢位的錯誤;否則直接分配相應的空間。

4:哪些在棧中,哪些在堆中

基本變數,如 int 、char、string、float 等變數分配記憶體時,使用的都是棧中的空間。

物件,比如oc中的 [[class alloc] init]、 c++ 中new 、c語言中的 malloc 出的物件時,使用的都是堆中的空間。

堆和棧區別

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

堆和棧區別

管理方式 棧由編譯器自動管理 堆由程式設計師控制,使用方便,但易產生記憶體洩露。生長方向 棧向低位址擴充套件 即 向下生長 是連續的記憶體區域 堆向高位址擴充套件 即 向上生長 是不連續的記憶體區域。這是由於系統用鍊錶來儲存空閒記憶體位址,自然不連續,而鍊錶從低位址向高位址遍歷。空間大小 棧頂位址和...

堆和棧區別

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