在C程序中,我面临需要大量内存块的事务,我需要知道是否有算法或最佳实践技术用于处理所有这些malloc/free,我使用数组来存储这些内存块但在某些时候数组本身已满,重新分配数组只会更加浪费,处理这个问题的优雅方法是什么?
最佳答案
这种情况下最好的算法是 free list分配器+二叉搜索树。
您向系统请求一大块内存,然后从该 block 中分配固定大小的内存块。当 block 已满时,您将分配另一个 block ,并将它们链接到红黑或 AVL 二叉搜索区间树(否则在 free
期间通过迭代 block 列表来搜索 block 将成为瓶颈)
同时,多线程和线程同步变得很重要。如果您只使用互斥锁或简单的自旋锁,您会发现 libc malloc 的工作速度比自定义内存分配器快得多。解决办法见Hazard pointer ,即每个线程都有自己的内存分配器(或每个 CPU 核心一个分配器)。这会增加另一个问题 - 当一个线程分配内存而另一个线程释放它时,这将需要在 free 函数期间搜索确切的分配器,并严格锁定或无锁数据结构。
最好的选择 - 您可以使用 jemalloc , tcmalloc或任何其他通用建议的快速内存分配器来完全或部分替换您的 libc(即 pdmalloc)默认分配器。
关于c - 应用什么算法来连续重新分配小内存块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50722561/