C C C 之記憶體分布

2021-10-07 15:33:46 字數 1430 閱讀 4805

一、基本知識

c++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區

1、棧:就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。

2、堆:就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉, 那麼在程式結束後,作業系統會自動**。

3、自由儲存區:就是那些由malloc等分配的記憶體塊,他和堆是十分相似的, 不過它是用free來結束自己的生命的。

4、全域性/靜態儲存區:全域性變數和靜態變數被分配到同一塊記憶體中,在以前的 c語言中,全域性變數又分為初始化的和未初始化的(初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數與靜態變數在相鄰的另一塊區域,同時未被初始化的物件儲存區可以通過void*來訪問和操縱,程式結束後由系統自行釋放),在c++裡面沒有這個區分了,他們共同占用同一塊記憶體區。

5、常量儲存區:這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改。

二、堆和棧的對比

1、棧是系統提供的功能,特點是快速高效,缺點是有限制,資料不靈活;

2、而棧是函式庫提供的功能,特點是靈活方便,資料適應面廣泛,但是效率有一定降低。

3、棧是系統資料結構,對於程序/執行緒是唯一的;

4、堆是函式庫內部資料結構,不一定唯一。

5、不同堆分配的記憶體無法互相操作。

6、棧空間分靜態分配和動態分配兩種。靜態分配是編譯器完成的,比如自動變數(auto)的分配。動態分配由alloca函式完成。棧的動態分配無需釋放(是自動的),也就沒有釋放函式。

他們的區別主要有以下幾個方面:

1、碎片問題:

2、生長方向:

3、分配方式:

4、分配效率

堆則是c/c++函式庫提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的演算法在堆記憶體中搜尋可用的足夠大小的空間,如果沒有足夠大小的空間,就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就有機會分到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多。

三、舉例

由下面這一段**來說明每個變數儲存的地方:

int a=1;

//a為全域性變數,放在全域性去

const

char

* str =

"abc"

;//*str是常量字串放在文字常量區,str指標放在全域性區

class

obj;

intf

(int lhs,

int rhs)

intmain()

C C C 記憶體管理

一 c c 記憶體分布 棧 存放非靜態變數 函式引數 返回值,棧是向下增長的 記憶體對映段是高效的i o對映方式,用於裝載乙個共享的通風太記憶體庫,使用者可使用系統介面建立共享記憶體,做程序間通訊 堆 用於執行時的動態記憶體分配,堆是可以向上增長的 資料段 用於存放全域性資料與靜態資料 段 用於存放...

C C C 記憶體管理

一.c c 記憶體分布 1.棧又叫堆疊,非靜態區域性變數 函式引數 返回值等等,棧是向下增長的 2.記憶體對映段是高效的i o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可以使用系統介面建立共享記憶體,做程序間通訊 3.堆用於程式執行時動態記憶體分配,堆是向上增長的 4.資料段,儲存全域性資料和...

STM32之記憶體分布與匯流排

系統包括乙個由多個互相連線的32位ahb匯流排組成的矩陣 cortex m4 with fpu core i bus,d bus and s bus dma1 memory bus dma2 memory bus dma2 peripheral bus ethernet dma bus usb ot...