内存碎片会减慢New/Malloc吗?

Does memory fragmentation slows down New/Malloc?

短背景:

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

问题:

我听说内存碎片会减慢 newmalloc 运算符的速度,因为它们需要 "find" 我离开的 "holes" 之一的位置在内存中,而不是简单地 "going forward" 在堆中。

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

但是 none 的答案提到了与性能有关的任何内容,只是分配大内存块失败。

那么内存碎片会不会让new花更多的时间来分配内存? 如果是,增加多少?我怎么知道 new 是否有 "Hard time" 在堆上查找内存?

我试图找到structures/algorithms GCC 用来在内存中找到一个"hole" 的数据是什么,以便在里面分配。但是找不到任何血统解释。

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

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

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

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

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

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

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

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

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

影响的重要性取决于内存分配算法。最好的方法是测量目标平台上的性能。