C 記憶體管理 記憶體分配

2022-03-25 10:28:24 字數 1919 閱讀 5134

1、c++編譯的程式占用的記憶體分類

(1)棧區(stack):程式執行時由編譯器自動分配,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。程式結束時由編譯器自動釋放。

(2)堆區(heap) :在記憶體開闢另一塊儲存區域。一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os**。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。

(3)全域性靜態區(static):編譯器編譯時即分配記憶體。全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後由系統釋放。

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

(5)程式**區:存放函式體(類成員函式和全域性函式)的二進位制**。

2、記憶體分配方式有三種

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

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

(3)從堆上分配:亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。

3、c++變數記憶體分布

通過程式加以說明

(1)變數分布

view code 1

#include 

#include

int g_i = 100;

int g_j;

int main()

執行結果:

執行結果

棧中資料位址(有初值):0x0012ff74 = 5

棧中資料位址(無初值):0x0012ff70 = -858993460

棧中資料位址(有初值):0x0012ff6c = a

靜態資料位址(有初值):0x00424a34 = 5

靜態資料位址(無初值):0x00427c48 = 0

全域性資料位址(有初值):0x00424a30 = 100

全域性資料位址(無初值):0x00427c44 = 0

press any key to continue

分析結果(debug):

a.變數在記憶體位址的分布為:棧-堆-**區-全域性靜態-文字常量區

b.同一區域的各變數按宣告的順序在記憶體的中依次由低到高分配空間,但棧中是由高到低的。

c.全域性變數和靜態變數如果不賦值,預設為0。 棧中的變數如果不賦值,則是乙個隨機的資料。

d.編譯器會認為全域性變數和靜態變數是等同的,已初始化的全域性變數和靜態變數分配在一起,未初始化的全域性變數和靜態變數分配在另一起。

(2)函式分布

view code 2

#include 

void fun(int i)

int main()

執行結果:

執行結果

主函式 靜態資料位址(有初值): 0x00424a34 = 100

子函式 靜態資料位址(無初值): 0x00427c48 = 0

子函式的引數: 0x0012ff28 = 5

子函式 靜態資料位址(有初值): 0x00424a30 = 100

子函式 靜態資料位址(無初值): 0x00427c44 = 0

press any key to continue

結果分析:

主函式中棧的位址都要高於子函式中引數及棧位址,證明了棧的伸展方向是由高位址向低位址擴充套件的。主函式和子函式中靜態資料的位址也是相鄰的,說明程式會將已初始化的全域性變數和靜態變數分配在一起,未初始化的全域性變數和靜態變數分配在另一起。

c 記憶體分配管理

1.1 先看看c 對記憶體分為哪幾個區?1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。想知道為什麼效率高嗎?因為關於棧的操作如push整合在處理器的指令集中,效率很高,但是分配的記憶體容量有限。2 堆區 heap 一般由程式設計師分配...

記憶體分配 Go記憶體管理 記憶體分配一

go作為乙個比較新晚 新 的語言,自然借鑑前輩們的優點,比如說語言本身負責記憶體管理 對協程和高併發的高優支援 簡單高效的語法等。本篇及後續的幾篇要講的就是還沒提到的比較複雜的記憶體管理。學習記憶體管理 分配 前,如果有jvm的記憶體管理的基礎,會變得非常簡單,如果是第一次接觸記憶體管理,在看完go...

記憶體分配管理

系統中的記憶體分為棧 堆 全域性區 區 棧 由編譯器自動分配釋放,參訪函式的引數值,區域性變數,函式棧幀,函式呼叫過程。堆 由程式設計師自行分配想要的空間大小,c中的malloc等函式,c 中的new 全域性區 資料區 存放的是全域性變數和靜態變數,初始化的存在一起,未初始化的放一起,程式結束後由系...