我目前正在研究Windows下的
首先,我知道在API层面上,Windows主要使用
好吧,这一切都很好。但是还有其他的
所有这些让我想知道一些事情:
malloc()
实现。但在我的研究中,我遇到了一些让我感到困惑的事情:首先,我知道在API层面上,Windows主要使用
HeapAlloc()
和VirtualAlloc()
调用来分配内存。从这里收集到的信息表明,Microsoft实现的malloc()
(包含在CRT - C运行时中)基本上为大于480字节的块调用HeapAlloc()
,而对于小的分配,则管理一个使用VirtualAlloc()
分配的特殊区域,以防止碎片化。好吧,这一切都很好。但是还有其他的
malloc()
实现,例如nedmalloc,声称比Microsoft的malloc
快高达125%。所有这些让我想知道一些事情:
为什么我们不能只调用
HeapAlloc()
来分配小块内存?它在碎片化方面表现不佳吗(例如采用“首次适配”而不是“最佳适配”)?- 实际上,有没有办法知道各种API分配调用的内部情况?那将非常有帮助。
是什么让
nedmalloc
比Microsoft的malloc
快得多?从上面的内容中,我得出的印象是
HeapAlloc()
/VirtualAlloc()
如此缓慢,以至于malloc()
很少调用它们,然后自己管理已分配的内存。这个假设是否正确?还是malloc()
“包装器”仅仅是因为碎片化?人们会认为这样的系统调用会很快 - 或者至少会有一些想法使它们高效。- 如果这是真的,为什么会这样?
平均而言,一个典型的
malloc
调用执行多少次内存读/写操作(可能是已分配段的函数数量级)?我直觉上会说对于一个平均程序来说,这个数字在十几次左右,我对吗?