简短背景:
我正在开发一个应该运行数月并使用动态分配的系统。
问题:
我已经听说,内存碎片会减慢new
和malloc
操作员的速度,因为他们需要在我留在内存中留下的一个"孔"中"找到"一个位置,而不是简单地在堆中"前进"。
我已经阅读了以下问题:什么是内存碎片?
但是,没有任何答案提及任何有关性能的任何内容,只有分配大记忆块的失败。
那么,内存碎片是否会使new
花费更多时间分配内存?如果是,多少钱?我怎么知道new
是否在堆上找到内存的"困难"?
我试图找到什么是数据结构/算法GCC用来在内存中找到一个"孔"以分配内部的"孔"。但找不到任何下降解释。
内存分配是特定于平台的,具体取决于平台。
我会说:"是的,new
需要时间分配内存。多少时间取决于许多因素,例如算法,碎片级别,处理器速度,优化等。
花费多少时间的最佳答案是配置和衡量。编写一个简单的程序,将内存分散,然后测量分配内存的时间。
没有直接的方法可以找出找到可用内存位置的困难。您可能可以读取时钟,分配内存,然后再次阅读。另一个想法是设置计时器。
注意:在许多嵌入式系统中,动态内存分配被皱眉。在关键系统中,分裂可以是敌人。因此使用固定尺寸的阵列。固定大小的内存分配(在编译时(将碎片删除作为缺陷问题。
编辑1:搜索
通常,内存分配需要调用功能。这样做的影响是,处理器可能必须重新加载其指令缓存或管道,从而消耗额外的处理时间。传递参数(例如最小尺寸(也可能有额外的指示。编译时的本地变量和分配通常不需要函数调用以进行分配。
除非分配算法是线性的(想想阵列访问(,否则将需要找到可用插槽的步骤。一些内存管理算法根据所需的大小使用不同的策略。例如,某些内存经理可能有64位或更小的尺寸的单独池。
如果您将内存管理器视为具有链接的块列表,则经理将需要找到与请求大于或相等的第一个块。如果块大于请求的大小,则可以将其拆分,然后将左内存储器上的左内存储器创建到新的块中并添加到列表中。
没有用于内存管理的标准算法。它们根据系统的需求而有所不同。具有限制(小(内存尺寸的平台的内存管理器将与具有大量内存的存储器管理器不同。关键系统的内存分配可能与非关键系统的内存分配不同。C 标准不要求内存管理器的行为,只有一些要求。例如,允许内存管理器从硬盘驱动器或网络设备分配。
影响的重要性取决于内存分配算法。最好的途径是测量目标平台上的性能。