malloc和free是如何实现的? 我想实现自己的动态内存管理系统,以增加新的功能,帮助管理C++中的内存。

malloc和free是如何实现的? 我想实现自己的动态内存管理系统,以增加新的功能,帮助管理C++中的内存。,c++,dynamic-memory-allocation,C++,Dynamic Memory Allocation,我使用Windows(XP)和Linux(Ubuntu)。 实现“malloc”和“free”等功能需要什么? 我认为我必须使用最低级别的系统调用 对于Windows,我找到了以下函数:GetProcessHeap、HeapAlloc、HeapCreate、HeapDestroy和HeapFree 对于Linux,我没有发现任何堆管理的系统调用。在Linux上,malloc和free是系统调用,不是吗 谢谢 编辑: C++不提供垃圾回收器,垃圾回收器速度慢。有些分配很容易释放,但有些分配需要垃圾

我使用Windows(XP)和Linux(Ubuntu)。 实现“malloc”和“free”等功能需要什么? 我认为我必须使用最低级别的系统调用

对于Windows,我找到了以下函数:GetProcessHeap、HeapAlloc、HeapCreate、HeapDestroy和HeapFree

对于Linux,我没有发现任何堆管理的系统调用。在Linux上,malloc和free是系统调用,不是吗

谢谢

编辑:
C++不提供垃圾回收器,垃圾回收器速度慢。有些分配很容易释放,但有些分配需要垃圾收集器

我想实现这些功能并添加新功能:
*每当调用free()时,检查指针是否属于堆。
*帮助垃圾收集。我必须存储有关已分配块的一些信息。

*使用多个堆(Windows上的HeapCreate/HeapDestroy)。我可以快速删除整个堆及其分配的块。

brk
是Linux上用于实现
malloc
free
的系统调用。请尝试手册页以获取信息

你已经把窗户的东西放下了


看到这里的其他答案,我想指出,你可能正在重新发明轮子;已经有很多好的
malloc
实现了。但是编程
malloc
是一个很好的思考练习-看看一个很好的家庭作业(最初是CMU代码)实现同样的功能。它们的shell提供的功能比Linux操作系统实际提供的功能要多一些:-)。

在Linux上,malloc和free不是系统调用。malloc/free通过使用
brk
系统调用扩展和收缩(如果可以)数据段,以及使用
mmap
获取匿名内存,从内核获取内存,malloc管理这些区域内的内存。可以找到一些基本信息或许多优秀的参考资料

如果您只是包装系统调用,那么使用标准malloc可能没有任何收获-这就是他们所做的一切

在程序开始时使用malloc(或HeapAlloc()等)单个内存块并自己管理分配到该内存块的情况更为常见,如果您知道要定期创建/丢弃大量小内存块,这可能会更有效率

在*nix中,malloc()是在C库级别实现的。它使用brk()/sbrk()增长/收缩数据段,使用mmap/munmap请求/释放内存映射。有关glibc和uClibc中使用的malloc实现的描述,请参阅

垃圾收集器速度慢

这是一个完全没有意义的声明。在许多实际情况下,程序可以通过使用垃圾收集器获得显著的性能提升,特别是在多线程场景中。在许多其他情况下,垃圾收集器会导致性能损失。

尝试使用指针


这是一个简短的性能比较,指向八种不同的malloc/free实现。这是一个很好的起点,因为一些很好的参考统计数据将帮助您确定是否在可用的实现上有所改进。

实际上,
sbrk
不是一个系统调用,而是一个库函数。您应该看看boost的池分配器:您确定HeapAlloc是一个系统(内核)调用吗?当进程需要更多的内存时,这些很可能在用户端实现,并触发一些隐藏的私有内核端函数。对不是吗?写内存管理代码是非常重要的。如果这是作业就好了。但我认为,除非您已经非常熟悉操作系统和运行时系统如何与内存交互,否则不值得花时间为您正在编写的任何应用程序编写任何主要内容。即使这样,通常也不值得付出努力,因为new/malloc都针对一般情况进行了高度优化,并且在大多数情况下都能很好地工作。除非您已经分析了内存使用情况,并且有一个非常独特的模式要为您进行优化,否则您不太可能做得比所提供的更好。垃圾收集器的性能通常很慢