我目前正在调查在Windows下的malloc()
实现。但在我的研究中,我偶然发现了让我感到困惑的事情:Windows内存分配问题
首先,我知道在API级别,windows主要使用调用HeapAlloc()
和VirtualAlloc()
来分配内存。我从here收集微软实施malloc()
(包括在CRT - C运行时)基本上呼吁HeapAlloc()
> 480字节的块,否则管理一个特殊的区域分配VirtualAlloc()
小分配,以防止碎片。
那么这一切都很好。但是接下来还有malloc()
的其他实现,例如nedmalloc,声称比微软的malloc
快125%。
这一切都让我不知道的几件事情:
为什么我们不能只调用
HeapAlloc()
为小块?在分散性方面表现不佳(例如,通过“先做”而不是“最适合”)?- 其实,有没有什么办法可以知道各种API分配调用的内幕?这会很有帮助。
是什么让比微软的
malloc
更快nedmalloc
这么多?从上面的,我得到的印象是
HeapAlloc()
/VirtualAlloc()
是如此缓慢,它是malloc()
快得多在一段时间只有一次打电话给他们,然后来管理分配的内存本身。这个假设是真的吗?或者是malloc()
“包装”只是因为碎片需要? 有人会认为这样的系统调用会很快 - 或者至少有一些想法会被加入到它们中,以提高效率。- 如果这是真的,为什么这样呢?
平均来说,有多少内存(一个数量级)读/写是由一个典型的
malloc
调用(可能已经分配的段数的函数)来执行?我会直觉地说,这是一个普通节目的十几岁,对吗?
另外,阅读关于“dlmalloc”的内容对于malloc策略来说是非常丰富的。 – Will 2010-07-07 22:53:35