5

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

首先,我知道在 API 级别,Windows 主要使用HeapAlloc()andVirtualAlloc()调用来分配内存。我从这里收集到malloc()(包含在 CRT 中的 C 运行时)的 Microsoft 实现基本上要求HeapAlloc()块 > 480 字节,否则管理分配给小分配的特殊区域VirtualAlloc(),以防止碎片。

好吧,这一切都很好。但还有其他实现malloc(),例如nedmalloc,声称比微软的malloc.

这一切让我想知道一些事情:

  1. 为什么我们不能只调用HeapAlloc()小块?是否在碎片方面表现不佳(例如通过“首次拟合”而不是“最佳拟合”)?

    • 实际上,有什么方法可以知道各种 API 分配调用的幕后情况吗?那会很有帮助。
  2. 是什么让nedmalloc微软的速度如此之快malloc

  3. 从上面我得到的印象是HeapAlloc()/太慢了,以至于偶尔调用它们然后自己管理分配的内存VirtualAlloc()要快得多。malloc()这个假设是真的吗?还是malloc()因为碎片化而只需要“包装器”?人们会认为像这样的系统调用会很快——或者至少会考虑一些想法来提高它们的效率。

    • 如果是真的,为什么会这样?
  4. malloc平均而言,一个典型的调用(可能是已分配段数的函数)执行了多少(一个数量级)内存读/写?我会直观地说这是一个平均程序的几十个,对吗?

4

2 回答 2

5
  1. 调用 HeapAlloc 听起来不是跨平台的。MS 可以根据需要自由更改其实现;建议远离。:)
  2. 它可能更有效地使用内存池,就像 Loki 库的“小对象分配器”一样
  3. 堆分配本质上是通用的,但在任何实现中总是很慢。分配器越“专业化”,它就会越快。这让我们回到第 2 点,它处理内存池(以及特定于您的应用程序使用的分配大小)。
  4. 不知道。
于 2010-07-07T22:45:01.520 回答
1

从上面我得到的印象是 HeapAlloc()/VirtualAlloc() 太慢了,malloc() 偶尔调用它们然后自己管理分配的内存要快得多。这个假设是真的吗?

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

于 2010-07-07T22:45:06.327 回答