为什么人们如何实现他们自己的malloc?

我一直在浏览SDL和Quake(1/2)源代码,我想知道为什么编程人员需要实现他们自己的malloc? (我认为SDL_malloc仅供内部SDL使用)。 如何?

他们的函数是否调用C malloc来在堆上分配一个大块,然后在那里管理它们的内存? 或者,也许他们静态地分配一个巨大的数组(但是失去了灵活性)?

这是我最感兴趣的(也适用于普通的malloc):他们自己是否只管理堆? 如果是这样,他们怎么知道堆的开始和结束在内存中? 他们将如何要求更多/更少的堆应用程序?

我在问这个问题,因为我有兴趣为一个爱好项目实现我自己的分配器。


为了为我的postscript解释器实现“虚拟内存”,我实现了自己的内存分配例程。 我需要通过C标准malloc无法提供的额外功能(如垃圾回收)。 它起始于一个简单的“区域”分配器,这不是太困难(使用标准的realloc来扩大该区域)。

C可能不是尝试这样做的最好的语言,因为它可能会使指针的使用复杂化。 使用C ++,你可以创建一个新的“托管指针”类,所以你的实际用法仍然看起来很正常。


对于像Quake这样的游戏,答案是99%的“为什么他们这样做(这样)?” 问题就是表现 。 更多帧/秒,更多细节/帧,更快的响应。 他们不希望标准分配器使用元数据链接列表,因为他们无法承受遍历列表的时间,因此他们使用散列表(或甚至更狂野)编写自己的代码。


在过去,我实现了自己的malloc() (或其他语言的等价物),作为追踪有害内存相关错误的最后手段。 由于存在良好的内存诊断和语言,因此放弃使用指针,现在不太需要这样做。

在我的情况下,我没有做完整个工作 - 我让我的malloc()将请求的内存分配与围栏数据,幻数,分配序列或时间信息等包装起来,以帮助诊断错误,然后调用系统malloc()来实际分配内存。

因此,调用p = my_malloc(nbytes)可能会生成如下所示的内存块:

FF00FF00 <leading fence>
<timestamp>
<allocation sequence number>
<allocation size>
nbytes of space <this is the block of memory that p will point to>
FF88FF88 <trailing fence>

...并且还会将一些诊断信息写入日志文件。

然后调用my_free(p)将检查在释放由my_malloc()分配的所有内存my_malloc() p指向的块之前和之后my_malloc()之前,栅栏,时间戳,序列号等未被破坏。 my_malloc()my_free()通常还会将一些诊断信息写入日志文件,以便让我匹配分配和取消分配并my_free()内存泄漏的来源。 当然,每次分配内存或取消分配时写入日志文件都会使程序减慢很多。 我经常把日志文件放在RAM磁盘上来解决这个问题。

链接地址: http://www.djcxy.com/p/14121.html

上一篇: Why and how do people implement their own malloc?

下一篇: How to cause stack overflow and heap overflow in python