[英]How does dynamic memory allocation work?
考慮以下代碼:
int *p = malloc(4);
int *i = malloc(4);
現在,已分配了一塊內存(在上述情況下為4個字節),並且基地址存儲在p
。
在int *i = malloc(4)
行中分配內存時。
編譯器如何知道這塊內存已分配?
為什么不分配與int *p = malloc(4)
分配的內存相同的塊?
當您在代碼中使用諸如malloc
例程並編譯並將其鏈接到可執行程序時,軟件例程庫也將鏈接到您的代碼中。 該庫中的例程具有用於從操作系統請求內存,將該內存划分為多個部分並在使用malloc
進行請求時將其釋放,以及跟蹤釋放了哪些內容以及使用free
釋放了哪些內容的軟件。
因此,每當您編譯一個非常小的程序時,您就會與它相伴的是一個龐大的,由人們使用多年的附加軟件庫。
編譯器不負責了解誰擁有什么內存,並且不會意外踐踏先前分配的內存。 這是操作系統的工作。 編譯器生成匯編代碼,其中在匯編代碼中進行適當的系統調用以從OS獲取指向一塊動態內存的指針。 為了演示,這是一個愚蠢的示例:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int* ptr = malloc(4);
free(ptr);
return 0;
}
現在,在編譯該程序並反匯編main
,匯編代碼如下所示:
0x0000000100000f50 <+0>: push %rbp
0x0000000100000f51 <+1>: mov %rsp,%rbp
0x0000000100000f54 <+4>: sub $0x10,%rsp
0x0000000100000f58 <+8>: mov $0x4,%eax
0x0000000100000f5d <+13>: mov %eax,%edi
0x0000000100000f5f <+15>: movl $0x0,-0x4(%rbp)
0x0000000100000f66 <+22>: callq 0x100000f8a
0x0000000100000f6b <+27>: mov %rax,-0x10(%rbp)
0x0000000100000f6f <+31>: mov -0x10(%rbp),%rax
0x0000000100000f73 <+35>: mov %rax,%rdi
0x0000000100000f76 <+38>: callq 0x100000f84
0x0000000100000f7b <+43>: xor %eax,%eax
0x0000000100000f7d <+45>: add $0x10,%rsp
0x0000000100000f81 <+49>: pop %rbp
0x0000000100000f82 <+50>: retq
注意callq
行。 編譯器僅負責調用適當的系統調用以獲取動態內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.