c++內存基本構造,以及內存分配方式

一. 內存基本構造

在C++中內存分成5個區,分別是堆、棧、全局/靜態存儲區、常量存儲區和代碼區;

1、棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變量的存儲區,裏面的變量通常是局部變量、函數參數等。

2、堆,就是那些由new分配的內存塊,他們的釋放編譯器不去管,由我們的應用程序去控制,一般一個new就要對應一個delete。如

果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。

3、全局/靜態存儲區,全局變量和靜態變量被分配到同一塊內存中,在以前的C語言中,全局變量又分爲初始化的和未初始化的,在

C++裏面沒有這個區分了,他們共同佔用同一塊內存區。

4、常量存儲區,這是一塊比較特殊的存儲區,他們裏面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改)。

5、代碼區 (.text段),存放代碼(如函數),不允許修改(類似常量存儲區),但可以執行(不同於常量存儲區)。


二. 3種內存分配方式

1、 從靜態存儲區域分配。在程序編譯的時候就已經分配好內存,並且這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量。

2、在棧上創建。在執行函數時函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元會自動被釋放。另外,棧內存分配運算內置於處理器的指令集。

3、從堆上分配,也就是動態內存分配。程序在運行的時候用malloc 或new 申請任意多少的內存,程序員自己負責在何時用free 或delete 釋放內存。動態內存的生存期由程序員決定。


三. 3種內存模型

根據c/c++對象生命週期不同,c/c++的內存模型有三種不同的內存區域,即:自由存儲區,動態區、靜態區

自由存儲區:局部非靜態變量的存儲區域,即平常所說的棧;

動態區: 用new ,malloc分配的內存,即平常所說的堆;

靜態區:全局變量,靜態變量,字符串常量存在的位置;

注:代碼雖然佔內存,但不屬於c/c++內存模型的一部分;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章