内存碎片是否会降低New/Malloc的速度?

Oop*_*ser 5 c++ memory memory-fragmentation

背景短:

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

问题:

我听说内存碎片减缓newmalloc运营商,因为他们需要在"洞"中的一个"发现"的地方,我留在了记忆,而不是在堆中简单的"前进".

我读过以下问题: 什么是内存碎片?

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

那么内存碎片会new花费更多时间来分配内存吗?如果是的话,多少钱?我如何知道是否new有"困难时间"在堆上查找内存?

我试图找到GCC用于在内存中找到"漏洞"以分配内部的数据结构/算法.但找不到任何血统的解释.

Tho*_*ews 7

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

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

花费多少时间的最佳答案是剖析和测量.编写一个简单的程序来分割内存,然后测量分配内存的时间.

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

注意:在许多嵌入式系统中,动态内存分配是不受欢迎的.在关键系统中,碎片可能是敌人.因此使用固定大小的数组.固定大小的内存分配(在编译时)将碎片删除为缺陷问题.

编辑1:搜索
通常,内存分配需要调用函数.这样做的影响是处理器可能必须重新加载其指令高速缓存或管道,从而消耗额外的处理时间.还可能有额外的指令用于传递参数,例如最小尺寸.编译时的局部变量和分配通常不需要函数调用来进行分配.

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

如果您认为内存管理器具有链接的列表,则管理器将需要找到大于或等于请求大小的第一个块.如果块大于请求的大小,则可以将其拆分,然后将剩余的内存创建为新块并添加到列表中.

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

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