C 中記憶體分配方式

2021-06-16 09:56:17 字數 2174 閱讀 9466

看了bs的c++程式語言和c++程式設計思想中所述

c++記憶體還是分為三部分

通常這三部分經常被放在一塊連續的物理儲存單元中,但是這也是由編譯器開發者決定它們的順序

1.靜態儲存區域

2.棧,建立自動物件

3.堆/自由儲存單元,在其上分配的記憶體稱為動態記憶體分配

舊的cmalloc、calloc、realloc、free

新的c++

new、delete

eg:

int main()

棧→就像去餐館吃飯,只要有錢就可以點菜,不用管怎麼做出的菜

堆→就像在家做飯,從買菜(new)到做菜都要親歷親為,當然最後還要洗盤子(delete),當然怎麼做由你決定

棧→類似資料結構中的棧

堆→鍊錶(在系統中不連線儲存)

棧→記憶體位址高位址到低位址(棧頂和棧大小確定)

堆→記憶體位址低位址到高位址(受系統虛擬記憶體影響)

棧→較快(暫存器)

堆→快(記憶體)

棧→較快(暫存器)

堆→快(記憶體)

eg:

char a=1;

char cstr="hello";

char *pstr="world";

a=cstr[1];//分別讀乙個字元

a=pstr[1];

char a=1;

00411448 mov byte ptr [ebp-9],1

char cstr="hello";

0041144c mov eax,dword ptr [string "hello" (416838h)]

00411451 mov dword ptr [ebp-1ch],eax

00411454 mov cx,word ptr ds:[41683ch]

0041145b mov word ptr [ebp-18h],cx

char *pstr="world";

0041145f mov dword ptr [ebp-28h],offset string "world" (416830h)

a=cstr[1];

00411466 mov al,byte ptr [ebp-1bh] //直接從暫存器al中讀出→一步到位

00411469 mov byte ptr [ebp-9],al

a=pstr[1];

0041146c mov eax,dword ptr [ebp-28h] //先把ptr放入eax

0041146f mov cl,byte ptr [eax+1] //再讀出eax+1到cl中→兩步

00411472 mov byte ptr [ebp-9],cl

棧→無記憶體碎片

堆→頻繁分配和釋放會產生記憶體碎片

計算機中有專門的暫存器指向棧所在的位址,專門的機器指令完成資料入棧出棧的操作。

這種機制的特點是效率高,支援的資料有限,一般是整數,指標,浮點數等系統直接支援的資料型別,並不直接支援其他的資料結構。因為棧的這種特點,對棧的使用在程式中是非常頻繁的

使用舉例:

對子程式的呼叫就是直接利用棧完成的。機器的call指令裡隱含了把返回位址推入棧,然後跳轉至子程式位址的操作,而子程式中的ret指令則隱含從堆疊中彈出返回位址並跳轉之的操作

c/c++中的自動變數是直接利用棧的例子,這也就是為什麼當函式返回時,該函式的自動變數自動失效的原因

宣告/定義時:

1.用malloc或new申請記憶體之後,應該用if(p==null)或if(p!=null)進行防錯處理

2.不要忘記為陣列和動態記憶體賦初值。防止將未被初始化的記憶體作為右值使用

3.避免陣列或指標的下標越界,特別要當心發生"多1"或者"少1"操作

4.動態記憶體的申請與釋放必須配對,防止記憶體洩漏

5.用free或delete釋放了記憶體之後,立即將指標設定為null/0,防止產生"野指標"

使用時:

1.檢查指標是否為null,防錯處理

2.如果指標p是函式的引數,函式的入口處用assert(p!=null)檢查

C記憶體分配方式與C 記憶體分配方式

c記憶體分配方式 注 malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊。然後,將該記憶體塊一分為二 一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組 接下來,將分配...

C 記憶體分配方式

在c 中,記憶體分成5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧 就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。在乙個程序中,位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現函式的呼叫。和堆一樣,使用者棧在程...

C 記憶體分配方式

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