我正在尝试创建自己的 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 岁一样解释,我很难理解这个概念。