堆和棧概念整理

2021-09-08 00:24:49 字數 1094 閱讀 5337

1.記憶體管理方式:

堆:一般由程式設計師分配釋放,程式設計師申請時需要指明大小,leg,c語言中malloc函式:p1=(char*)malloc(10),c++中:p2=new char[20].若程式設計師不去釋放,當程式結束時可能由作業系統釋放 ,注意其與資料結構的堆完全是兩回事,分配方式類似於鍊錶,分配釋放的關鍵字:new,malloc,delete,free

棧:由系統自動分配和釋放,存放函式的引數值,區域性變數等等,操作類似於資料結構的棧,eg:生命乙個區域性變數 int b,系統自動在棧中為其開拓空間

2.系統響應:

堆:os有乙個記錄空閒記憶體位址的鍊錶,當os收到程式的申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式,另外,對於大多數系統,會在這塊記憶體空間中的首位址處記錄本次分配的大小,這樣**中的delete語句才能正確的釋放本記憶體空間。另外由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒鍊錶中。

棧:只要棧的剩餘空間大於申請空間,系統將為程式提供記憶體,否則將報異常,提示棧溢位

3.分配效率

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

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

4.存放內容:

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

棧:存放函式引數(由右往左入棧),函式中的區域性變數。(多數c編譯器下)

5.生長方向:

6.碎片問題:

堆:頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低。

棧:則不會存在這個問 題, 因為棧是先進後出的佇列,且儲存空間保持林旭。

7.空間大小:

堆:一般來講在32位系統下,記憶體可以達到4g的空間,從這個角度來看堆記憶體幾乎是沒有什麼限制的。

棧:一般都是有一定的空間大小的。

詳見:

Delphi筆記 整理 堆和棧

在windows 下,乙個程式的堆疊由兩個值定義 堆疊的最小值和最大值。這兩個值受編譯器指示字 minstacksize 和 maxstacksize 所控制,它們的預設值分別是16,384 16k 和1,048,576 1m 在linux 下,堆疊大小只能由環境設定。在register 約定下,最...

堆和棧的區別 概念

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

棧和堆的概念和區別

在程序位址布局 如下圖 可見位址的分布情況,棧和堆所在的位置區域。棧 由編譯器自動分配釋放,存放函式的引數值 區域性變數的值等。其操作方式類似於資料結構中的棧。每當乙個函式被呼叫,該函式返回位址和一些關於呼叫的資訊,比如某些暫存器的內容,被儲存到棧區。然後這個被呼叫的函式再為它的自動變數和臨時變數在...