Windows内存分配问题

Nor*_*wap 5 windows malloc memory-management dynamic-memory-allocation nedmalloc

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

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

那一切都很好,很好.但是还有其他一些实现malloc(),例如nedmalloc,它声称比微软快了125%malloc.

所有这些让我想到了一些事情:

  1. 为什么我们不能只召唤HeapAlloc()小块?在碎片方面表现不佳(例如通过"先适合"而不是"最适合")?

    • 实际上,有没有办法知道各种API分配调用的内幕是什么?这将非常有帮助.
  2. 是什么nedmalloc比微软更快malloc

  3. 从上面的内容来看,我的印象是HeapAlloc()/ VirtualAlloc()速度太慢,以至于malloc()只是偶尔调用一次然后管理分配的内存本身要快得多.这个假设是真的吗?或者是malloc()因为碎片而需要的"包装"?有人会认为像这样的系统调用会很快 - 或者至少会有一些想法被放入其中以使它们有效.

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

Bre*_*ias 5

  1. 调用HeapAlloc听起来并不是跨平台的.MS可以随时改变他们的实施; 建议远离.:)
  2. 它可能更有效地使用内存池,就像Loki库中的"小对象分配器"一样
  3. 堆分配通常是通用的,通过任何实现总是很慢.分配器越"专业化",它就越快.这使我们返回到#2点,它处理内存池(以及特定于您的应用程序使用的分配大小).
  4. 不知道.