C ++:内存分配器

时间:2011-01-09 23:59:57

标签: c++ memory-management

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

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

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

5 个答案:

答案 0 :(得分:19)

内存分配器不是低级别而不是malloc。 (默认分配器通常直接或间接调用malloc

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

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

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

答案 1 :(得分:17)

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

重新考虑自定义内存分配ACM linkdirect PDF linkPowerpoint talk slides),OOPSLA 2002。

  

程序员希望实现   性能改进经常使用   自定义内存分配器。这个   深入研究考察了八项   使用自定义的应用程序   分配器。令人惊讶的是,六个   这些应用程序,是最先进的   通用分配器(Lea   allocator)和or一样好   比自定义分配器更好。该   两个例外使用区域,其中   提供更高的性能   (改进高达44%)。地区   也减少程序员的负担和   消除内存泄漏的来源。   但是,我们表明无能为力   程序员释放单个对象   在区域内可以导致a   记忆力大幅增加   消费。更糟糕的是,这个限制   排除使用地区   常见的编程习语,减少   他们的用处。我们提出一个   通用的概括和   我们称之为基于区域的分配器   收获。收益是一个组合   地区和堆,提供一个完整的   范围的区域语义与   添加个别对象   删除。我们表明我们的   实施收获提供了很高的   表现优于其他   具有区域语义的分配器。   然后,我们使用案例研究   展示空间优势和   收获的软件工程的好处   在实践中。我们的结果表明   需要快速区域的程序员   应该使用收益,而且最多   程序员考虑定制   分配器应该使用Lea   分配器。

答案 2 :(得分:5)

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

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

答案 3 :(得分:2)

内存分配器用作速度优化。 操作系统的分配很慢。因此,您自己的内存管理器会抓取大量内存,然后从该内存桶中为您分配,而无需通过操作系统。这种技术更常用于游戏/控制台/嵌入式系统。

http://www.memorymanagement.org/articles/

http://www.ibm.com/developerworks/aix/tutorials/au-memorymanager/au-memorymanager-pdf.pdf

答案 4 :(得分:1)

malloc()是libc(或glibc)中的库函数,当需要实际为进程分配更多内存时,它会使系统调用sbrk()。 malloc()和free()一起管理调用malloc(),calloc()等时使用的内存块列表。

当malloc()不需要行为或者你想在malloc / free之上做额外的工作时,可以使用自定义分配器。