我遇到了一个面试问题,他们要求在C++中实现malloc()和自由函数。
在一开始就声明了一个大小为 50000(50000 字节)的 char 数组。假设这是堆内存,编写 malloc 和 free 函数来分配内存块并释放内存。
任何人都可以为我提供C++工作/伪代码或只是解释机制?(显然代码会让它更容易理解)。
谢谢罗希特
虽然编写生产级动态内存分配器是一项非常艰巨的任务,但编写玩具分配器非常简单。这个问题显然是为了测试你的技能,但在别人的作品中寻找灵感仍然是公平的。
Kernighan & Ritchie的"The C Programming Language"包含malloc
的简单实现。研究它并考虑其设计和实施的含义。考虑如何改进它以更好地执行、减少碎片或处理多个线程。在那之后,编写自己的玩具分配器并回答出现的任何问题应该不再困难。
可以使用几种不同的算法。 对于这样的内存很小,我只是在每个块前面加上指向下一个块的指针块,以及指示它是已分配还是释放的标志。 一分配包括找到一个足够大的可用块,将其拆分如有必要,并将返回的块标记为已分配。 一个免费的包括将块标记为空闲。 在某些时候,您还必须合并块:如果两个自由块相互跟随,则它们被合并合二为一。 (我在实现中的分配期间执行此操作。
上述算法本身并不难。 真正的诀窍是获得所有不同的演员阵容等等。 这是一个很好的练习在非常低级的编程中。
我以前没有测试过它,但我认为可以通过使用新的关键字和模板来支持创建所需类型数组的通用状态来做到这一点,但我会按照这个问题来找出C++英雄的反应.