3 1 4 棧和堆的區別

2021-09-27 15:41:12 字數 874 閱讀 1796

棧是由編譯器在程式執行時分配的空間,由作業系統維護。堆是由malloc( )函式(c++語言為new運算子)分配的記憶體塊,記憶體的管理由程式設計師手動控制,在c語言使用free( )函式完成(c++中為delete運算子)。棧和堆的主要區別有以下幾點。

(1)管理方式不同。

程式在執行時棧由作業系統自動管理,無須程式設計師手工控制;而堆空間的申請、釋放工作由程式設計師控制,容易產生記憶體洩漏。

(2)空間大小不同。

棧是向低位址擴充套件,是一塊連續的記憶體區域。即棧頂的位址和棧的最大容量是系統預先規定好的,當申請的空間超過棧的剩餘空間時,將出現棧溢位錯誤。

堆是向高位址擴充套件,是不連續的記憶體區域。因為系統是用鍊錶來儲存空閒記憶體位址的,且鍊錶的遍歷方向是由低位址向高位址。

(4)增長方向不同。

在x86平台上,堆的增長方向是向上的,即向著記憶體位址增加的方向;棧的增長方向是向下的,即向著記憶體位址減小的方向。

(5)分配方式不同。

堆都是程式中由malloc( )函式動態申請分配並由free( )函式釋放的;棧的分配和釋放是由作業系統完成的,棧的動態分配由alloca( )函式完成,但是棧的動態分配和堆是不同的,其由編譯器進行申請和釋放的,無須手工實現。

(6)分配效率不同。

棧是系統提供的,作業系統會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行堆則是c函式庫提供的,它的機制很複雜,例如為了分配一塊記憶體,庫函式會按照一定的演算法在堆記憶體中搜尋可用的足夠大的空間,如果沒有足夠大的空間,則需要作業系統來重新整理記憶體空間,這樣就有機會分到足夠大小的記憶體,然後返回。顯然,堆的效率比棧要低得多。

堆和棧區別

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

堆和棧區別

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

堆和棧區別

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