c – New vs. Malloc,当重载New时

我正在重载new和delete来实现我自己的小对象/线程安全分配器.

问题是当我超载新的时候,我不能在不破坏普遍因果关系或至少编译器的情况下使用新的.我发现大多数示例都是新的重载,使用Malloc()进行实际分配.但根据我对C的理解,对于Malloc()根本就没有用例.

多个答案与此类似,有些在SO:In what cases do I use malloc vs new?之外的侵权较少

我的问题是,如何在不使用Malloc()的情况下重载operator new时如何分配实际内存?

(这绝对是出于好奇,尽量不要过于严肃地对待过载的推理;我对任何人都有一个单独的问题!)

解决方法

简短回答:如果您不想要现有的malloc,则需要实现自己的堆管理器.

堆管理器,例如Linux的glibc中的malloc,Windows中的HeapAlloc,是用户级算法.首先,请记住,堆已经过优化,可以分配4~512字节的小尺寸对象.

如何实现自己的堆管理器?至少,您必须调用在您的进程中分配内存块的系统API.有适用于Windows的VirtualAlloc和适用于Linux的sbrk.这些API分配了大量内存,但大小必须是页面大小的倍数.通常,x86和Windows / Linux中的页面大小为4KB.

获得一大块页面后,您需要实现自己的算法,如何将这个大内存切割成较小的请求.经典(仍然非常实用)的实现和算法是dlmalloc:http://g.oswego.edu/dl/html/malloc.html

要实现,您需要有多个用于簿记的数据结构和一些用于优化的策略.例如,对于像16,20,36,256字节这样的小对象,堆管理器维护每个大小的块列表.所以,有一个列表列表.如果请求的大小大于页面大小,则只需调用VirtualAlloc或sbrk.但是,有效的实施非常具有挑战性.您不仅要考虑速度和空间开销,还要考虑缓存局部性和碎片.

如果您对针对多线程环境优化的堆管理器感兴趣,请查看tcmallochttp://goog-perftools.sourceforge.net/doc/tcmalloc.html

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...