【发布时间】:2011-04-07 01:30:57
【问题描述】:
我需要分配和释放大量固定大小的小(16 字节)内存块,没有固定的顺序。我可以只为每个调用 malloc 和 free,但这可能会非常低效。更好的解决方案可能是为更大的块调用 malloc 和 free,并自行处理这些块内的分配。
问题是,如何最好地做到这一点?
看起来这应该不是一个非常不寻常的问题或罕见的问题,应该已经“解决”了,但我似乎找不到任何东西。有什么指点吗?
为了澄清,我知道内存池库和不存在的东西,但这些也需要一个大小参数。如果大小是恒定的,那么可以使用不同的更高效算法的选项,是否有这些实现?
【问题讨论】:
-
您是否需要这种内存“一次性”,例如某些算法,或者您是否会在程序生命周期内执行此操作(可能很长?)
-
开发分配库的标准之一是它在这种情况下的表现如何,甚至在不友好的情况下。虽然实现自定义分配例程很有趣,但您可能不需要它。
-
@Skurmedel - 在整个程序执行过程中会请求和释放大量内存。
-
“如果大小不变,则可以使用不同的选项来获得更高效的算法” - 效率并不高,我看不出你会在哪里找到算法差异。明显的优势是添加/减去立即常量而不是存储变量,这是相当小的啤酒。如果你手头有一个内存池库,那么修改它以硬编码 16 的大小并与原始库进行基准测试应该很容易。使用 C++,您可以(和标准库一样)将其作为模板参数,或者对于 C,使用宏并针对每种大小进行编译。
-
如果您担心速度,这不是问题。如果您担心内存消耗过多,
malloc的任何典型实际实现都会在您的负载下产生 50% 的开销(预期内存使用量的 1.5 倍)。