2011-01-09 116 views
15

我听说过有人为自己的项目使用自定义内存分配器,特别是C++。C++:内存分配器

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

  • 是不是malloc已经是最低级别了?

+1

@muntoo:这完全不提分配器。 – jalf 2011-01-10 00:18:03

+0

@jalf我还在学习如何阅读。 – 2011-01-10 00:49:20

回答

18

甲内存分配器不是较低水平malloc。 (默认分配器通常直接或间接呼叫malloc

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

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

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

+1

+ 1-有许多分配策略,malloc只是一个尽可能具有普遍性能的分配策略。 – Puppy 2011-01-10 00:34:12

5

自定义内存分配器是malloc(实际上,通常代替operator new)的替代品,它以非默认方式检索字节块。 malloc不是您可以去的最低级别,因为malloc本身是通过操作系统中更简单的基元来实现的,这些基元为分区分配内存块。

制定自定义分配器的常用用例针对小对象的分配进行了优化(默认分配器通常非常糟糕),以确保良好局部性的方式进行分配(通过将对象分配给另一个对象),使用logging /跟踪(用于诊断泄漏),从垃圾收集资源池中分配等等。有很多不同的选项可供选择,许多程序可以使用这些自定义分配器来提高性能。

1

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

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

16

下面的文章(我写的)中有对自定义分配器的广泛描述以及他们的经验性评估。在您决定在您的 C++项目中使用自定义分配器之前,您应该阅读本文。执行概述是好的通用分配器比除地区之外的所有样式的自定义分配器更好(更快且更节省空间),但这些分配器存在严重问题

反思定制内存分配ACM linkdirect PDF linkPowerpoint talk slides)2002年OOPSLA。

程序员希望实现 性能改进通常使用 自定义内存分配器。这个深入研究的 检查使用定制 分配器的八个 应用程序。令人惊讶的是,对于 这六个应用程序,最新的 通用分配器(Lea 分配器)的性能好于自定义分配器,或者性能分配器的性能好于 。 两个例外使用区域,其中 提供更高的性能 (改进高达44%)。地区 也减少程序员的负担和 消除内存泄漏的来源。然而,我们表明, 程序员无法在区域内释放个别对象 可能导致内存消耗的大幅增加 。更糟的是,这种限制 排除了 常见的编程风格使用的区域,减少 他们usefulness.We呈现 概括的通用和 基于区域的分配器,我们称之为 人收割。收割是 区域和堆的组合,提供完整的 范围的区域语义与 添加个别对象 删除。我们表明,我们的 实施收益提供了高性能,优于其他 分配器与区域般的语义。 然后我们用一个案例研究来证明 在实践中的空间优势和 软件工程带来的收益 的好处。我们的结果表明 需要快速区域 的程序员应该使用reaps,而且大多数考虑自定义 分配器的程序员应该使用分配器来使用Lea 。