記憶體分配及堆與棧的區別

2022-09-08 10:57:09 字數 1656 閱讀 9742

記憶體分配方式有三種:

1.從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。

2.從堆疊上分配。函式內的區域性變數的儲存單元,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

3.從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由程式設計師決定,使用非常靈活,但如果在堆上分配了空間,就有責任**它,否則執行的程式會出現記憶體洩漏,頻繁地分配和釋放不同大小的堆空間將會產生堆內碎塊。

乙個程式將作業系統分配給其執行的記憶體塊分為5個區域:

1、棧區(stack):由編譯器自動分配釋放 ,存放為執行函式而分配的區域性變數、函式引數、返回資料、返回位址等。其操作方式類似於資料結構中的棧。

2、堆區(heap)

:一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。分配方式類似於鍊錶。

3、靜態區,亦稱全域性區。全域性變數、靜態變數和常量都是儲存在該區的,程式結束後該區的變數由系統釋放。該區具體又可以三部分:

1)已初始化的全域性變數和靜態變數。

2)未初始化的全域性變數和靜態變數。

3)常量資料區。

4、文字常量區:程式**中使用的常量字串,程式結束後由系統釋放。

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

int a = 0;	//全域性初始化區

char *p1; //全域性未初始化區

int main()

4.1 申請方式

stack: 由系統自動分配,是由編譯器自動管理,無需我們手工控制。

heap: 需要程式設計師自己申請,並指明大小。對於堆來說,釋放工作由程式設計師控制,容易產生memory leak。

4.2 申請後響應

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

heap:首先應該知道作業系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式的申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。 

4.3 申請的空間大小

stack:在windows下,棧的大小是2m,由編譯器決定。

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

4.4 生長方式

4.5 申請效率

stack:由於棧是編譯器自動管理的,因此棧的申請效率高,但程式設計師無法控制。

heap:堆由new或malloc動態申請,一般速度較慢,並且容易產生記憶體碎片。能被程式設計師控制,使用方便。

4.6 儲存內容

stack:在函式呼叫時,第乙個進棧的是主函式中後的下一條指令(函式呼叫語句的下一條可執行語句)的位址,然後是函式的各個引數,在大多數的c編譯器中,引數是由右往左入棧的,然後是函式中的區域性變數。注意靜態變數是不入棧的。

當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的位址,也就是主函式中的下一條指令,程式由該點繼續執行

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

記憶體分配堆與棧的區別

堆 heap 與棧 stack 是開發人員必須面對的兩個概念,在理解這兩個概念時,需要放到具體的場景下,因為不同場景下,堆與棧代表不同的含義。一般情況下,有兩層含義 1 程式記憶體布局場景下,堆與棧表示兩種記憶體管理方式 2 資料結構場景下,堆與棧表示兩種常用的資料結構。1.程式記憶體分割槽中的堆與...

c c 記憶體分配(棧與堆的區別)

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

記憶體分配 堆和棧的區別

1 資料結構的棧和堆 堆疊,實際上堆疊是兩種資料結構 堆和棧。堆和棧都是把一些資料項按序排列的資料結構。2 記憶體分配中的棧和堆 這裡有必要把記憶體分配 一般情況下程式存放在rom或flash中,執行時需要拷到記憶體中執行,記憶體會分別儲存不同的資訊,如下圖 資料在記憶體中的儲存圖示 所示 0xc0...