C++:内存分配器

Rai*_*aik 15 c++ memory-management

我听说有人为他们的项目使用自定义内存分配器,特别是在C++中.

  • 与malloc相比,什么是自定义内存分配器?

  • malloc不是你可以去的最低级别吗?

jal*_*alf 20

存储器分配程序是不较低水平malloc.(默认分配器通常malloc直接或间接调用)

分配器只允许您指定不同的分配策略.例如,您可以使用一个调用malloc一次的分配器来检索一个大的内存池,然后对于后续的分配请求,它只返回该池的一小部分.

或者您可以将它用作钩子,以允许您在每次分配或释放内存时执行一些额外的任务.

关于你的第二个问题,malloc你可以在不失去便携性的情况下走得最低.malloc通常使用某些特定于操作系统的内存分配函数来实现,因此仍然是较低级别.但这与你的主要问题无关,因为C++分配器是一个更高级别的抽象.


Eme*_*ger 17

在下面的文章(我共同撰写)中,对自定义分配器及其实证评估进行了广泛的描述.在您决定在使用自定义的分配你的 C++项目,你应该给本文的读取.执行概述是一个好的通用分配器比除了区域之外的所有样式的自定义分配器更好(更快和更节省空间),但是这些有严重的问题.

重新考虑自定义内存分配(ACM链接,直接PDF链接,Powerpoint谈话幻灯片),OOPSLA 2002.

希望实现性能改进的程序员经常使用自定义内存分配器.这项深入研究检查了八个使用自定义分配器的应用程序.令人惊讶的是,对于其中六个应用程序,最先进的通用分配器(Lea分配器)的性能与自定义分配器相同或更好.这两个例外使用区域,提供更高的性能(改进高达44%).区域还减少了程序员的负担并消除了内存泄漏的来源.但是,我们表明程序员无法在区域内释放单个对象会导致内存消耗大幅增加.更糟糕的是,这种限制排除了将区域用于通用编程习语,降低了它们的实用性.我们提出了我们称之为reaps的通用和基于区域的分配器的概括.Reaps是区域和堆的组合,提供了全方位的区域语义,并添加了单个对象删除.我们证明了我们的reaps实现提供了高性能,优于其他具有类似区域语义的分配器.然后,我们使用案例研究来证明实践中收益的空间优势和软件工程优势.我们的结果表明需要快速区域的程序员应该使用收益,并且大多数考虑自定义分配器的程序员应该使用Lea分配器.


tem*_*def 5

自定义内存分配器是malloc(实际上通常是替换operator new)的替代,它以某种方式检索字节块而不是默认值. malloc并不是你可以去的最低级别,因为malloc它本身是根据来自操作系统的更简单的原语来实现的,这些原语分配了用于分区的内存块.

制作自定义分配器的常见用例是针对小对象的分配进行优化(默认分配器通常非常糟糕),以保证良好局部性的方式分配(通过将对象分配到彼此附近),分配日志/跟踪(到诊断泄漏),从垃圾收集的资源池中分配等.有许多不同的选项可供使用,许多程序可以使用这些自定义分配器来挤出更多的性能.