我读到一些游戏重写了他们自己的malloc以提高效率。我不明白在虚拟内存的世界里这怎么可能。如果我没记错的话,malloc实际上调用了一个特定于操作系统的函数,该函数使用MMU将虚拟地址映射到真实地址。那么,如何在不调用实际运行时的malloc的情况下,创建自己的内存分配器并分配实际内存呢?
谢谢
发布于 2011-01-16 12:29:27
当然,编写一个比通用分配程序更高效的分配器是可能的。
如果你知道你的分配的属性,你就可以把通用的分配器踢出局。
举个例子:许多年前,我们不得不为嵌入式系统设计和编码一个通信子系统(HDLC、X.25和专有层)。事实上,我们知道最大分配总是小于128字节(或类似的东西),这意味着我们根本不必纠结于可变大小的块。不管你要求多少,每个分配都是128字节。
当然,如果您要求更多,它会返回NULL。
通过使用固定长度的块,我们能够大大加快分配和释放的速度,使用位图和相关结构来保存记帐信息,而不是依赖于速度较慢的链表。此外,不需要合并释放的块。
诚然,这是一个特例,但你会发现游戏也是如此。事实上,我们甚至在通用系统中使用了这种方法,在这种系统中,低于某个阈值的分配会以同样的方式从自我管理的预分配池中获得固定数量的内存。任何其他分配(大于阈值或池已完全分配)被发送到“真正的”malloc
。
发布于 2011-01-16 12:27:56
仅仅因为malloc()
是一个标准的C函数并不意味着它是对内存系统的最低级别的访问。事实上,malloc()
可能是在较低级别的操作系统功能方面实现的。这意味着你也可以调用那些较低级别的接口。它们可能是特定于操作系统的,但它们可能会使您获得比malloc()
界面更好的性能。如果是这样的话,你可以以任何你想要的方式实现你自己的内存分配系统,而且可能会更有效率-例如,针对你将要进行的分配的大小和频率的特征来优化算法。
发布于 2011-01-16 12:30:19
通常,malloc将调用特定于操作系统的函数来获取一堆内存(至少一个VM页面),然后根据需要将内存划分为更小的块,以返回给malloc的调用者。
malloc库还将有一个(或多个)空闲块列表,因此它通常可以满足请求,而无需请求操作系统提供更多内存。确定要处理多少不同的块大小,决定是否尝试组合相邻的空闲块,等等,这些都是malloc库实现者必须做出的选择。
您可以绕过malloc库,直接调用操作系统级别的“给我一些内存”函数,并在从操作系统获得的内存中进行自己的分配/释放。这样的实现可能是特定于操作系统的。另一种选择是使用malloc进行初始分配,但要维护自己的已释放对象缓存。
https://stackoverflow.com/questions/4703775
复制相似问题