首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >让你自己的malloc函数?

让你自己的malloc函数?
EN

Stack Overflow用户
提问于 2011-01-16 12:20:32
回答 6查看 4.1K关注 0票数 10

我读到一些游戏重写了他们自己的malloc以提高效率。我不明白在虚拟内存的世界里这怎么可能。如果我没记错的话,malloc实际上调用了一个特定于操作系统的函数,该函数使用MMU将虚拟地址映射到真实地址。那么,如何在不调用实际运行时的malloc的情况下,创建自己的内存分配器并分配实际内存呢?

谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-16 12:29:27

当然,编写一个比通用分配程序更高效的分配器是可能的。

如果你知道你的分配的属性,你就可以把通用的分配器踢出局。

举个例子:许多年前,我们不得不为嵌入式系统设计和编码一个通信子系统(HDLC、X.25和专有层)。事实上,我们知道最大分配总是小于128字节(或类似的东西),这意味着我们根本不必纠结于可变大小的块。不管你要求多少,每个分配都是128字节。

当然,如果您要求更多,它会返回NULL。

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

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

票数 8
EN

Stack Overflow用户

发布于 2011-01-16 12:27:56

仅仅因为malloc()是一个标准的C函数并不意味着它是对内存系统的最低级别的访问。事实上,malloc()可能是在较低级别的操作系统功能方面实现的。这意味着你也可以调用那些较低级别的接口。它们可能是特定于操作系统的,但它们可能会使您获得比malloc()界面更好的性能。如果是这样的话,你可以以任何你想要的方式实现你自己的内存分配系统,而且可能会更有效率-例如,针对你将要进行的分配的大小和频率的特征来优化算法。

票数 3
EN

Stack Overflow用户

发布于 2011-01-16 12:30:19

通常,malloc将调用特定于操作系统的函数来获取一堆内存(至少一个VM页面),然后根据需要将内存划分为更小的块,以返回给malloc的调用者。

malloc库还将有一个(或多个)空闲块列表,因此它通常可以满足请求,而无需请求操作系统提供更多内存。确定要处理多少不同的块大小,决定是否尝试组合相邻的空闲块,等等,这些都是malloc库实现者必须做出的选择。

您可以绕过malloc库,直接调用操作系统级别的“给我一些内存”函数,并在从操作系统获得的内存中进行自己的分配/释放。这样的实现可能是特定于操作系统的。另一种选择是使用malloc进行初始分配,但要维护自己的已释放对象缓存。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4703775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档