C C 中堆與棧的區別

2021-10-25 20:09:14 字數 1091 閱讀 8631

在c/c++中堆與棧有兩種含義:

記憶體層面:表示兩種記憶體分配及管理方式。

c/c++的記憶體分配主要包含以下幾個方面:

1、棧區(stack):由編譯器自動分配釋放,存放函式的位址,引數值,區域性變數等。

2、堆區(heap):一般由程式設計師分配釋放(malloc/free、new/delete),若程式設計師不釋放,程式結束時可能由作業系統**。

3、全域性區(static):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域,程式結束後由系統釋放。

4、文字常量區:常量字串就是放在這裡的,程式結束後由系統釋放。

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

堆與棧對於兩種不同的記憶體分配方式,主要有以下幾種區別:

空間大小不同:棧上記憶體比較小,在windows下乙個程序的棧記憶體預設為1m,linux下乙個程序的棧記憶體預設為10m。堆記憶體大小遠遠大於棧記憶體,堆記憶體理論上可達4g,實際可用會比此資料小。

記憶體管理方式不同:棧上分配的記憶體不需程式設計師手動釋放,超過其作用域範圍後由編譯器自動釋放;堆上分配的記憶體,需要程式設計師手動釋放,否則會造成記憶體洩漏,導致程式執行期間占用記憶體較大,甚至越來越大。在程式結束後才由作業系統釋放,生命週期等同於程式的生命週期。

記憶體生長方向不同:棧記憶體位址比堆記憶體位址高,棧記憶體生長方向向下,位址由高往低,也就是說同意作用域內先分配的變數位址比後分配的變數位址要高。堆記憶體的生長方向向上,位址由低往高,後申請的記憶體空間並不一定在先申請的記憶體空間的後面,因為先申請的記憶體空間一旦被釋放,後申請的記憶體空間則會利用先前被釋放的記憶體,從而導致先後分配的記憶體空間在位址上不存在先後關係。

分配方式及效率不同:棧記憶體包含動態分配記憶體和靜態分配,靜態分配由作業系統完成,比如我們常見的區域性變數的分配,動態分配一般用的較少,由alloca函式進行分配,由自動系統釋放,無需手動釋放。堆記憶體只有動態分配記憶體,通過new運算子完成動態記憶體分配,需要收到呼叫delete釋放分配的記憶體。棧記憶體分配效率較高,在硬體層級對棧提供支援(分配專門的暫存器存放棧的位址),壓棧出棧都有專門的指令執行。堆記憶體分配效率相對於棧較低,由c/c++提供的庫函式或運算子來完成申請與管理,實現機制較為複雜,頻繁的記憶體申請容易產生記憶體碎片。

C C 中堆和棧的區別

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

C C 中堆和棧的區別

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

C C 中堆和棧的區別

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