Windows内存分配问题

我目前正在研究Windows下的malloc()实现。 但是在我的研究中,我偶然发现了困惑我的事情:

首先,我知道在API级别,Windows主要使用HeapAlloc()VirtualAlloc()调用来分配内存。 我从这里收集到, malloc() (包含在CRT-C运行库中)的Microsoft实现基本上调用HeapAlloc()来处理大于480字节的数据块,并以小分配方式pipe理分配给VirtualAlloc()的特殊区域,以防止碎片化。

那么这一切都很好。 但是接下来还有其他的malloc() ,例如nedmalloc ,声称比Microsoft的malloc快125%。

所有这些让我想知道几件事情:

  1. 为什么我们不能把HeapAlloc()称为小块? 在分散性方面performance不佳(例如,通过“先做”而不是“最适合”)?

    • 其实,是否有任何方法可以知道各种API分配调用的内幕? 这将是相当有益的。
  2. 是什么让nedmalloc比微软的malloc快得多呢?

  3. 从上面我得到的印象是, HeapAlloc() / VirtualAlloc()是如此之慢以至于malloc()在一段时间内只调用一次,然后pipe理分配的内存本身要快得多。 这个假设是真的吗? 或者是malloc() “包装”只是因为碎片需要? 有人会认为这样的系统调用会很快 – 或者至less有一些想法可以提高效率。

    • 如果这是真的,为什么呢?
  4. 平均来说,一个典型的malloc调用(可能是已经分配的段的数量的函数)执行多less(一个数量级)的内存读/写操作? 我会直觉地说,这是一个普通节目的十几岁,对吗?

  1. 调用HeapAlloc听起来不是跨平台的。 当他们希望的时候MS可以自由地改变他们的实现; 建议远离。 🙂
  2. 它可能更有效地使用内存池,就像Loki库的“小对象分配器”
  3. 堆分配,通常是本质的,通过任何实现总是很慢。 分配器越“专业化”,速度越快。 这将使我们返回到第2点,它处理内存池(以及使用的特定于您的应用程序的分配大小)。
  4. 不知道。

从上面可以看出,HeapAlloc()/ VirtualAlloc()的速度太慢了,malloc()在一段时间内只调用一次,然后自己管理分配的内存会快得多。 这个假设是真的吗?

操作系统级别的系统调用是为管理整个进程的内存空间而设计和优化的。 使用它们为一个整数分配4个字节实际上是不理想的 – 通过管理库代码中的微小分配,让操作系统针对更大的分配进行优化,从而获得总体上更好的性能和内存使用率。 至少据我了解。