我看到了this question,但它只是说明了我想做的事情,而不是解释如何去做。
我有一个C
库,可以在支持动态内存分配的系统上运行,也可以在不支持动态内存分配的系统上运行。我想通过编写自己的malloc
函数来简化系统之间的转换,该函数在堆不可用时从静态数组中分配内存。
我不是在寻找一个完全充实的问题解决方案,但是一个带有示例的博客文章会有所帮助。确定何时何时不使用malloc
很容易。但是我花了一些时间来弄清楚如何从静态数组中分配内存。
static char my_memory[10000] = { 0 };
static void *my_malloc(size_t size) {
// Here, I want to allocate 'size' in 'my_memory'.
return NULL;
}
static void *my_free(void* memory) {
// Here, I want to free 'memory' from 'my_memory'.
}
编辑:
我的需求非常简单,在这里,很少有内存将以这种方式分配(很少被释放)。 Steve Jessop的简单解决方案非常合适。
答案 0 :(得分:2)
关于最简单的分配器,可以编写:
current_position = my_memory + sizeof(my_memory)
。根据实施的对齐要求,您可能必须确保current_position
正确对齐。return ((current_position - my_memory) <= size) ? 0 : (current_position -= size);
。对于对齐,您可能必须先将size
舍入到某个数字的倍数。就是这样。显然,如果你经常调用free
,这个策略太快会耗尽内存。所以你可以介绍一个复杂功能:
size
足够的空间,将分配的大小写入您从阵列中删除的每个“块”的开头。返回指向大小记录末尾的指针(即可用内存的开头)。此外,请确保每个分配都足够大,以包含您定义的头结构,即使请求的数量少于此结构。您已经引入了每分配开销,但这允许您:
free:使用header struct将释放的块添加到某种数据结构中(继续记住大小)。
分配:如果数据结构中有一个可以满足请求的分配,则返回它,否则从主阵列中取出另一个分片并返回。
现在你有一个工作内存分配器。它并不特别井,你比现有技术落后了大约60年,所以你可能需要引入更多的复杂功能。但是内存分配算法的整个历史超出了单一答案的范围。你可以从这里开始,直到你的分配器足够好,或者你放弃并决定使用现有的库。
答案 1 :(得分:1)
您可以在每次分配开始时将地址(在您的情况下为数组中的偏移量)保存到下一个空闲块,即您使用某些数组作为空闲块列表。这会考虑你如何分配和查找内存块,免费是比较棘手的,因为你回馈内存需要做的不仅仅是调整阵列中的自由偏移,你还需要将多个多块块合并在一起,否则你最终导致内存碎片,然后你无法以你需要的大小分配块。
我认为关键的概念是分配的块也总是包含到下一个空闲块的偏移量,这就是你如何使用你自己的数组来跟踪它中分配的内容。
答案 2 :(得分:1)
一个老人,但是一个好东西(描述问题的博客文章):http://g.oswego.edu/dl/html/malloc.html
或者,如果您正在寻找打包的东西:http://hempeldesigngroup.com/embedded/stories/memorymanager/