5

简短的背景:

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

问题:

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

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

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

那么内存碎片是否会new花费更多时间来分配内存?如果是,多少?我怎么知道new在堆上查找内存是否“困难”?

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

4

1 回答 1

7

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

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

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

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

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

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

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

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

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

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

于 2017-06-26T19:40:54.307 回答