制作自己的malloc功能?

jma*_*erx 10 c malloc

我读到有些游戏会重写自己的malloc以提高效率.我不明白在虚拟内存世界中这是如何实现的.如果我没记错的话,malloc实际上调用了一个特定于操作系统的功能,它将虚拟地址映射到MMU的真实地址.那么,如何在不调用实际运行时的malloc的情况下,如何制作自己的内存分配器并分配实内存?

谢谢

pax*_*blo 8

编写一个比一般用途更有效的分配器当然是可能的.

如果您知道分配的属性,则可以将通用分配器从水中吹出.

举个例子:很多年前,我们不得不为嵌入式系统设计和编写通信子系统(HDLC,X.25和专有层).事实上,我们知道最大分配总是小于128个字节(或类似的东西)意味着我们根本不需要使用可变大小的块.无论您要求多少,每个分配都是128个字节.

当然,如果你要求更多,它返回NULL.

通过使用固定长度的块,我们能够大大加快分配和解除分配,使用位图和相关结构来保存记帐信息,而不是依赖于较慢的链接列表.此外,不需要合并释放的块.

当然,这是一个特例,但你会发现游戏也是如此.事实上,我们甚至在一个通用系统中使用它,在这个系统中,低于某个阈值的分配从自我管理的预分配池中以相同的方式获得固定数量的内存.任何其他分配(大于阈值或池完全分配)都被发送到"真实" malloc.

  • 我写了一篇关于这个主题的综合研究.回顾点是,与最先进的内存分配器相比,自定义内存分配器的性能优势通常低于通告的性能优势.见http://www.cs.umass.edu/~emery/pubs/berger-oopsla2002.pdf (4认同)