c - Linux 堆——做大量的新建/删除操作是否正常,或者堆是否变得严重碎片化?

标签 c linux gcc http-headers heap-memory

我不熟悉 Linux 堆是如何分配的。

我每秒多次调用 malloc()/free(),总是使用相同的大小(大约有 10 个结构,每个结构都是固定大小)。除了初始化时间之外,我的内存都没有长时间分配。

这是否被认为是标准堆的不良形式? (我确定有人会问“您使用的是什么堆?”-“呃。标准静态堆”..意思是我不确定。)

我应该改为使用空闲列表还是让堆容忍大量相同的分配。我试图平衡可读性和性能。

有什么工具可以帮我衡量吗?

最佳答案

首先,除非您测量内存使用激增的问题,否则不要考虑使用自定义分配器。这是最糟糕的过早优化形式之一。

与此同时,即使您确实遇到问题,比自定义分配器更好的解决方案是弄清楚为什么要分配和释放这么多对象,并解决导致问题的设计问题。

为了解决您的具体问题,glibc 的分配器基于 dlmalloc 算法,该算法在碎片化方面接近最佳。让它严重碎片化内存的唯一方法是不可避免的方法:通过交替分配具有完全不同生命周期的对象,例如分配大量对象但只释放每个其他对象。我认为您将很难制定出一种总内存使用率比池更差的分配模式...

关于c - Linux 堆——做大量的新建/删除操作是否正常,或者堆是否变得严重碎片化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7215759/

相关文章:

c - C89 中的可变长度数组?

c - C 中结构体的大小

c++ - 使用从列表中弹出的 pthreads 填充大小的列表

c++ - 相同的线程 ID

php - 多个站点的 Linux 服务器子域

linux - 从 headless 程序获取蓝牙事件

c++ - c++语言引用

c - 下面的代码是什么意思?

c - 更多 GCC 链接时间问题 : undefined reference to main

c++ - 带有早期 if 语句的函数中不必要的 pop 指令