練習用に独自の malloc() を作成しようとしています。このスレッドから以下のコードを取得しました。
typedef struct free_block {
size_t size;
struct free_block* next;
} free_block;
static free_block free_block_list_head = { 0, 0 };
// static const size_t overhead = sizeof(size_t);
static const size_t align_to = 16;
void* malloc(size_t size) {
size = (size + sizeof(free_block) + (align_to - 1)) & ~ (align_to - 1);
free_block* block = free_block_list_head.next;
free_block** head = &(free_block_list_head.next);
while (block != 0) {
if (block->size >= size) {
*head = block->next;
return ((char*)block) + sizeof(free_block);
}
head = &(block->next);
block = block->next;
}
block = (free_block*)sbrk(size);
block->size = size;
return ((char*)block) + sizeof(free_block);
}
void free(void* ptr) {
free_block* block = (free_block*)(((char*)ptr) - sizeof(free_block ));
block->next = free_block_list_head.next;
free_block_list_head.next = block;
}
メモリ チャンクをリンク リストとして扱うことについて混乱しています。基本的に、メモリが必要になるたびに sbrk() を呼び出し、以前に要求したメモリの一部がその間に解放されていないかどうかを確認しているようです。
しかし、他のプロセスに属する他のメモリ チャンクをチェックする方法はありません。以前に要求してリンク リストに追加したメモリのみをチェックします。
もしそうなら、これは最適ですか?これが標準の malloc() の仕組みですか? ヒープ上のすべてのメモリを操作する方法はありますか?
私が 5 歳のように説明してください。この概念を理解するのに苦労しています。