c++ - 内存碎片会减慢 New/Malloc 的速度吗?

标签 c++ memory memory-fragmentation

短背景:

我正在开发一个应该运行数月并使用动态分配的系统。

问题:

我听说内存碎片会减慢 newmalloc 运算符的速度,因为它们需要在我留下的“漏洞”之一中“找到”一个位置在内存中,而不是简单地在堆中“前进”。

我读过以下问题: What is memory fragmentation?

但是没有一个答案提到任何关于性能的事情,只是分配大内存块失败。

那么内存碎片是不是让new需要更多的时间来分配内存呢? 如果是,增加多少?我怎么知道 new 是否正在“艰难”地寻找堆上的内存?

我试图找到 GCC 用来在内存中找到要在内部分配的“洞”的数据结构/算法是什么。但找不到任何血统解释。

最佳答案

内存分配是特定于平台的,具体取决于平台。

我会说“是的,new 需要时间来分配内存。多少时间取决于许多因素,例如算法、碎片级别、处理器速度、优化等。

关于花费多少时间的最佳答案是分析和测量。编写一个简单的程序,对内存进行分段,然后测量分配内存的时间。

程序没有直接的方法来找出找到可用内存位置的难度。您可以读取一个时钟,分配内存,然后再次读取。另一个想法是设置一个计时器。

注意:在许多嵌入式系统中,动态内存分配是不受欢迎的。在关键系统中,碎片化可能是大敌。所以使用固定大小的数组。固定大小的内存分配(在编译时)消除了作为缺陷问题的碎片。

编辑 1:搜索
通常,内存分配需要调用一个函数。这样做的影响是处理器可能不得不重新加载其指令缓存或流水线,从而消耗额外的处理时间。也可能有额外的指令用于传递参数,例如最小尺寸。编译时的局部变量和分配通常不需要函数调用来分配。

除非分配算法是线性的(想想数组访问),否则将需要步骤来找到可用的槽。一些内存管理算法根据请求的大小使用不同的策略。例如,一些内存管理器可能有单独的池用于 64 位或更小的大小。

如果您将内存管理器视为具有 block 的链表,则该管理器将需要找到大于或等于请求大小的第一个 block 。如果 block 大于请求的大小,它可能会被拆分,然后将剩余的内存创建为一个新 block 并添加到列表中。

没有内存管理的标准算法。它们根据系统的需要而不同。具有受限(小)内存大小的平台的内存管理器将不同于那些具有大量内存的平台。关键系统的内存分配可能与非关键系统的不同。 C++ 标准不强制要求内存管理器的行为,只有一些要求。例如,允许内存管理器从硬盘驱动器或网络设备分配。

影响的重要性取决于内存分配算法。最佳途径是衡量目标平台上的性能。

关于c++ - 内存碎片会减慢 New/Malloc 的速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44767273/

相关文章:

C++ 类构造函数限定为 __attribute__((pure)) 或 __attribute__((const))

php - Postgres - 批量运行查询?

c - 如何获得可以分配的最大可用内存块?

c++ - 递归可变函数模板

C++ 哈希弃用警告

ios - 在 Modal Segue 之后从内存中删除 UIViewController

ios - 所有 iPad 版本的内存警告阈值

c - 内存碎片

linux - Redisused_memory_rss 大于配置集 'maxmemory' 吗?

c++ - 打印 C++ 项目中的所有代码 list