棧空間 C語言 「堆」和「棧」的七個不同之處

2021-10-16 06:38:20 字數 1437 閱讀 9552

對於程式設計初學者來說會接觸到一些難以理解的名稱,比如堆(heap)、棧(stack)、堆疊(stack)等。初學開發過程中往往讓人混淆不清。今天我們來談談堆和棧的具體區別,來幫助初學者理清思路。

堆和棧的區別一直都是永恆的話題,為此筆者也查了很多的資料,以防自己的理解錯誤,而給他人造成理解偏差。

「堆」和「棧」

先從簡單的乙個例子引出堆和棧:

void function()

這是c語言開發學習過程中,必不可免要學習的知識,動態分配一塊空間,空間在堆區大小是40位元組(32位系統中)。而定義的指標變數p是區域性變數,在棧區中 占用4位元組空間,用來存放剛剛前面動態分配的空間的首位址。

可以看出,在這一句**中同時包含了棧和堆,如下圖所示。

堆和棧的區別

我們從以下幾個方面比較一下堆和棧:

1、儲存內容不同

堆:一般是在堆的頭部用乙個位元組存放堆的大小。堆中的具體內容有程式設計師安排。

2、管理方式上不同

棧:由系統自動分配空間,同時系統自動釋放空間。例如,宣告在函式中乙個區域性變數「int b「。系統自動在棧中為b開闢空間,當對應的生存週期結束後棧空間自動釋放。

堆:需要程式設計師手動申請並且手動釋放,並指明大小。在c語言中malloc函式申請,釋放free函式,在c++中new和delete實現。

3、空間大小不同

棧:獲取空間較小。在windows下,一般大小是1m或2m,當剩餘棧空間不足時,分配失敗overflow。

堆:獲得空間根據系統的有效虛擬記憶體有關,比較靈活,比較大。

4、能否產生碎片不同

棧:不會產生碎片,空間連續。

堆:採用的是鍊錶的儲存方式,會產生碎片。

5、生長方向不同6、分配方式不同棧:有2種分配方式——靜態分配和動態分配。靜態由編譯器完成,例如區域性變數;動態由alloca函式實現,並且編譯器會進行釋放。

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

7、分配效率不同

棧:由系統自動分配,速度較快。但程式設計師是無法控制的。

堆:由new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來方便。

以上是棧和堆幾個方面的不同,希望通過上面的資料可以幫助初學者分清堆和棧。

C 的棧空間和堆空間

一直都把堆疊放一起,所以很多人會誤以為他們的組合是乙個詞語,就像 衣服 一樣簡單,其實不然,今天在下就將最近學習總結的一些與大家分享。乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,其操作方式類似於資料結構的棧。2...

棧空間 堆和棧的區別

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

棧和堆的空間大小 C

棧 在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體區域。棧頂的位址和棧的最大容量是系統預先規定好的,在window下,棧的大小是2mb,linux下,預設棧空間大小為8mb,可通過ulimit s來設定。特點 棧的速度快 空間小,不靈活 堆 堆是向高位址擴充套件的資料結構,是...