我目前正在研究Windows下的malloc()
实现。 但是在我的研究中,我偶然发现了困惑我的事情:
首先,我知道在API级别,Windows主要使用HeapAlloc()
和VirtualAlloc()
调用来分配内存。 我从这里收集到, malloc()
(包含在CRT-C运行库中)的Microsoft实现基本上调用HeapAlloc()
来处理大于480字节的数据块,并以小分配方式pipe理分配给VirtualAlloc()
的特殊区域,以防止碎片化。
那么这一切都很好。 但是接下来还有其他的malloc()
,例如nedmalloc ,声称比Microsoft的malloc
快125%。
所有这些让我想知道几件事情:
为什么我们不能把HeapAlloc()
称为小块? 在分散性方面performance不佳(例如,通过“先做”而不是“最适合”)?
是什么让nedmalloc
比微软的malloc
快得多呢?
从上面我得到的印象是, HeapAlloc()
/ VirtualAlloc()
是如此之慢以至于malloc()
在一段时间内只调用一次,然后pipe理分配的内存本身要快得多。 这个假设是真的吗? 或者是malloc()
“包装”只是因为碎片需要? 有人会认为这样的系统调用会很快 – 或者至less有一些想法可以提高效率。
平均来说,一个典型的malloc
调用(可能是已经分配的段的数量的函数)执行多less(一个数量级)的内存读/写操作? 我会直觉地说,这是一个普通节目的十几岁,对吗?
从上面可以看出,HeapAlloc()/ VirtualAlloc()的速度太慢了,malloc()在一段时间内只调用一次,然后自己管理分配的内存会快得多。 这个假设是真的吗?
操作系统级别的系统调用是为管理整个进程的内存空间而设计和优化的。 使用它们为一个整数分配4个字节实际上是不理想的 – 通过管理库代码中的微小分配,让操作系统针对更大的分配进行优化,从而获得总体上更好的性能和内存使用率。 至少据我了解。