c 堆和棧以及區別

2021-09-07 19:59:59 字數 1385 閱讀 2531

c++中記憶體分成5個區:堆、棧、自由儲存區、全域性\靜態儲存區、常量儲存區

棧是一種連續儲存的資料結構,具有先進後出的性質。堆是一種非連續的樹形儲存資料結構,每個節點有乙個值,整棵樹是經過排序的,特點是根節點的值最小(或最大),且根節點的兩個子樹也是乙個堆。

//

main.cpp

int a = 0; //

全域性初始化區

char *p1; //

全域性未初始化區

main()

堆和棧的區別:

(1)管理方式:

堆中資源由程式設計師控制(通過malloc/free、new/delete,容易產生memory leak),如果程式設計師沒有釋放掉,資源將由作業系統在程式結束後自動**。

棧資源由編譯器在需要時自動分配,不需要時自動清除的變數儲存區,通常存放區域性變數、函式引數等。

(2)系統響應:

對於堆,系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式申請時,遍歷該鍊錶,尋找第乙個大於所申請空間的空間的堆結點,刪除空閒結點鍊錶中的該結點,並將該結點空間分配給程式(大多數系統會在這塊記憶體空間首位址記錄本次分配的大小,這樣delete才能正確釋放本記憶體空間,另外,系統會將多餘的部分重新放入空閒鍊錶中)。

對於棧,只要棧的剩餘空間大於所申請空間,系統就會為程式分配記憶體,否則報異常出現棧空間溢位錯誤。

(3)空間大小:

堆是不連續的記憶體區域(因為系統是用鍊錶來儲存空閒記憶體位址的,自然不是連續),堆的大小受限於計算機系統中有效的虛擬記憶體(32位機器上理論上是4g大小),所以堆的空間比較靈活,比較大。

棧是一塊連續的記憶體區域,大小是作業系統預定好的,windows下棧大小是2m(也有是1m,在編譯時確定,vc中可設定)。

(4)碎片問題:

對於堆,頻繁的new/delete會造成大量記憶體碎片,降低程式效率。

對於棧,它是乙個先進後出(first-in-last-out)的結構,進出一一對應,不會產生碎片。

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分 

1、棧區(stack)― 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

2、堆區(heap) ― 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。

注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。

3、全域性區(靜態區)(static)―,全域性變數和靜態變數的儲存是放在一塊的,

初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放

4、文字常量區 ―常量字串就是放在這裡的。 程式結束後由系統釋放

5、程式**區―存放函式體的二進位制**。

C 堆和棧區別

c 中,記憶體分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧 是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數 函式引數等。堆 是由new分配的記憶體塊,由程式設計師釋放 編譯器不管 一般乙個new與乙個delete對應,乙個new與乙個delete對...

堆和棧的概念以及區別

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

c 棧和堆的區別

在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...