我目前正在研究malloc()
Windows 下的实现。但在我的研究中,我偶然发现了令我困惑的事情:
首先,我知道在 API 级别,Windows 主要使用HeapAlloc()
andVirtualAlloc()
调用来分配内存。我从这里收集到malloc()
(包含在 CRT 中的 C 运行时)的 Microsoft 实现基本上要求HeapAlloc()
块 > 480 字节,否则管理分配给小分配的特殊区域VirtualAlloc()
,以防止碎片。
好吧,这一切都很好。但还有其他实现malloc()
,例如nedmalloc,声称比微软的malloc
.
这一切让我想知道一些事情:
为什么我们不能只调用
HeapAlloc()
小块?是否在碎片方面表现不佳(例如通过“首次拟合”而不是“最佳拟合”)?- 实际上,有什么方法可以知道各种 API 分配调用的幕后情况吗?那会很有帮助。
是什么让
nedmalloc
微软的速度如此之快malloc
?从上面我得到的印象是
HeapAlloc()
/太慢了,以至于偶尔调用它们然后自己管理分配的内存VirtualAlloc()
要快得多。malloc()
这个假设是真的吗?还是malloc()
因为碎片化而只需要“包装器”?人们会认为像这样的系统调用会很快——或者至少会考虑一些想法来提高它们的效率。- 如果是真的,为什么会这样?
malloc
平均而言,一个典型的调用(可能是已分配段数的函数)执行了多少(一个数量级)内存读/写?我会直观地说这是一个平均程序的几十个,对吗?