簡體   English   中英

動態內存分配如何工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM