LInux之堆和棧的區別

2021-08-24 23:46:32 字數 962 閱讀 6731

(1)管理方式不同:

程式執行時,棧是由作業系統自動分配管理,無需程式設計師人工控制,包括函式的引數值、返回值、區域性變數等。而堆空間的申請、釋放都是有程式設計師人工控制,也因此容易產生記憶體洩漏。

(2)空間大小不同:

棧是向低位址擴充套件,是一塊連續的記憶體區域。即棧頂的位址和棧的最大容量是系統預先規定好的,當申請的空間超過棧的剩餘空間時,將出現棧溢位錯誤。而堆是高位址擴充套件,是不連續的記憶體區域。因為系統是用鍊錶來儲存空閒記憶體位址的,且鍊錶的遍歷方向是由低位址向高位址擴充套件。

(3)產生碎片不同:

對於堆來說,頻繁的malloc/free(new/delete)勢必會造成記憶體空間的不連續,從而造成大量的記憶體碎片,程式的執行效率降低。而對於棧來說,分配的一定是連續的記憶體空間。

(4)分配方式不同:

堆都是程式中由malloc/new函式動態申請分配,有free/delete函式釋放的;而棧的分配和釋放是由作業系統完成的。棧的動態分配可有alloc()函式手動完成,但一般都無需手動操作,而是交給編譯器自動進行申請和釋放的。

(5)分配效率不同:

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

Linux之堆和棧的區別

原文 1 管理方式不同 程式執行時,棧是由作業系統自動分配管理,無需程式設計師人工控制,包括函式的引數值 返回值 區域性變數等。而堆空間的申請 釋放都是有程式設計師人工控制,也因此容易產生記憶體洩漏。2 空間大小不同 棧是向低位址擴充套件,是一塊連續的記憶體區域。即棧頂的位址和棧的最大容量是系統預先...

堆和棧區別

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

堆和棧區別

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