[英]Windows memory allocation questions
我目前正在研究Windows下的malloc()
实现。 但是在研究中,我偶然发现了令我困惑的事情:
首先,我知道在API级别上,Windows主要使用HeapAlloc()
和VirtualAlloc()
调用来分配内存。 我从这里收集到,Microsoft的malloc()
(包含在CRT中-C运行时)基本上对大于480字节的块调用HeapAlloc()
,否则为小分配管理用VirtualAlloc()
分配的特殊区域,为了防止碎片化。
好吧,这一切都很好。 但是然后还有malloc()
其他实现,例如nedmalloc ,它声称比Microsoft的malloc
快高达125%。
所有这些使我感到奇怪:
为什么我们不能只为小块调用HeapAlloc()
? 在碎片化方面是否表现不佳(例如,通过“第一适应”而不是“最佳适应”)?
是什么使nedmalloc
比Microsoft的malloc
快得多?
从上面的内容,我得到的印象是HeapAlloc()
/ VirtualAlloc()
是如此之慢,以至于malloc()
偶尔仅调用一次然后管理分配的内存本身要快得多。 这个假设是真的吗? 还是由于碎片而仅需要malloc()
“包装器”? 有人会认为像这样的系统调用会很快-或至少应该考虑其中的一些想法才能使它们高效。
平均而言,一个典型的malloc
调用执行了多少次(数量级)内存读/写(可能是已经分配的段数的函数)? 我可以凭直觉说一个普通程序的费用是几十美元,对吗?
从上面的内容,我得到的印象是HeapAlloc()/ VirtualAlloc()是如此之慢,以至于malloc()偶尔仅调用一次然后管理分配的内存本身要快得多。 这个假设是真的吗?
操作系统级别的系统调用是为管理进程的整个内存空间而设计和优化的。 使用它们为整数分配4个字节确实不是最佳选择-通过管理库代码中的微小分配并让OS针对更大的分配进行优化,可以总体上提高性能和内存使用率。 至少据我了解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.