gpt4 book ai didi

自定义内存分配器

转载 作者:太空狗 更新时间:2023-10-29 15:14:22 25 4
gpt4 key购买 nike

我写了一个自定义内存分配器。它有 2 个我想删除的限制,所以它像 malloc/free 一样工作。

1.) mem_free 调用需要将其输入参数转换为 unsigned char *。我希望它采用任何类型的指针。如何做到这一点?

2.) 我编写的内存分配器将一 block 内存分配到缓冲区的前面,并且还写入了它的大小。 free 函数删除缓冲区中最后分配的内存块。所以 malloc/free 调用的顺序很重要,否则它将不起作用。我怎样才能取消这个限制?

希望能够做到这一点:

char* ptr1 = mem_alloc(10);
char* ptr2 = mem_alloc(4);

mem_free(ptr1);
mem_free(ptr2);

现在必须这样做:

char* ptr1 = mem_alloc(10);
char* ptr2 = mem_alloc(4);

mem_free(ptr2);
mem_free(ptr1);

代码:

unsigned char* mem_alloc(unsigned int size) {
unsigned int s;
if( (size + MEM_HEADER_SIZE) > (MEM_MAX_SIZE - mem_current_size_bytes) ) {
return NULL;
}
if(is_big_endian() == 0) {
s = (mem_buff[3] << 24) + (mem_buff[2] << 16) + (mem_buff[1] << 8) + mem_buff[0];
} else {
s = (mem_buff[0] << 24) + (mem_buff[1] << 16) + (mem_buff[2] << 8) + mem_buff[3];
}
memcpy(mem_buff + mem_current_size_bytes, &size, sizeof(unsigned int));
unsigned char* result = mem_buff + (mem_current_size_bytes + MEM_HEADER_SIZE);
mem_current_size_bytes += MEM_HEADER_SIZE + size;
return result;
}

void mem_free(unsigned char* ptr) {
unsigned int i,s;
for(i=0; i<mem_current_size_bytes; i++) {
if( (char*)ptr == (char*)(mem_buff + i) ) {
if(is_big_endian() == 0) {
s = (*(ptr - 1) << 24) + (*(ptr - 2) << 16) + (*(ptr - 3) << 8) + *(ptr - 4);
} else {
s = (*(ptr - 4) << 24) + (*(ptr - 3) << 16) + (*(ptr - 2) << 8) + *(ptr - 1);
}
mem_current_size_bytes-=s;
mem_current_size_bytes-=MEM_HEADER_SIZE;
break;
}
}
}

最佳答案

1) 改为使用 void*。
2) 存储一个地址映射到已分配 block 和一个单独的未分配 block 映射。然后,您可以在分配的映射中查找哪个 block 正在被释放,将其删除,然后将该 block 添加到未分配的映射中(确保将它与它任一侧的任何空闲 block 合并)。当然,这可能而且确实会导致内存碎片,但这确实是不可避免的。

关于自定义内存分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6564516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com