分配静态内存(作为malloc替换)

时间:2012-12-04 16:40:40

标签: c memory-management static malloc

我看到了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的简单解决方案非常合适。

3 个答案:

答案 0 :(得分:2)

关于最简单的分配器,可以编写:

  • init:current_position = my_memory + sizeof(my_memory)。根据实施的对齐要求,您可能必须确保current_position正确对齐。
  • 分配:return ((current_position - my_memory) <= size) ? 0 : (current_position -= size);。对于对齐,您可能必须先将size舍入到某个数字的倍数。
  • free:什么都不做。

就是这样。显然,如果你经常调用free,这个策略太快会耗尽内存。所以你可以介绍一个复杂功能:

  • 分配:增加size足够的空间,将分配的大小写入您从阵列中删除的每个“块”的开头。返回指向大小记录末尾的指针(即可用内存的开头)。此外,请确保每个分配都足够大,以包含您定义的头结构,即使请求的数量少于此结构。

您已经引入了每分配开销,但这允许您:

  • free:使用header struct将释放的块添加到某种数据结构中(继续记住大小)。

  • 分配:如果数据结构中有一个可以满足请求的分配,则返回它,否则从主阵列中取出另一个分片并返回。

现在你有一个工作内存分配器。它并不特别,你比现有技术落后了大约60年,所以你可能需要引入更多的复杂功能。但是内存分配算法的整个历史超出了单一答案的范围。你可以从这里开始,直到你的分配器足够好,或者你放弃并决定使用现有的库。

答案 1 :(得分:1)

您可以在每次分配开始时将地址(在您的情况下为数组中的偏移量)保存到下一个空闲块,即您使用某些数组作为空闲块列表。这会考虑你如何分配和查找内存块,免费是比较棘手的,因为你回馈内存需要做的不仅仅是调整阵列中的自由偏移,你还需要将多个多块块合并在一起,否则你最终导致内存碎片,然后你无法以你需要的大小分配块。

我认为关键的概念是分配的块也总是包含到下一个空闲块的偏移量,这就是你如何使用你自己的数组来跟踪它中分配的内容。

答案 2 :(得分:1)

一个老人,但是一个好东西(描述问题的博客文章):http://g.oswego.edu/dl/html/malloc.html

或者,如果您正在寻找打包的东西:http://hempeldesigngroup.com/embedded/stories/memorymanager/