3

今天阅读Rust subreddit,我看到以下评论:

jemalloc 针对(多线程)速度进行了优化,而不是内存使用

在做了更多的研究之后,我发现还有更多的选择(比如 calloc)。

我想了解不同内存分配器的优缺点是什么?

如果这个问题看起来很愚蠢,那么我的背景主要是解释语言(它不会暴露如此精细的内存控制)。

4

1 回答 1

0

malloc, calloc, 和realloc

这些函数不是不同的分配器。它们是从同一个分配器请求内存的不同方式。

  • malloc提供内存而不初始化它(填充之前用户存储在其中的任何内容)。

  • calloc相同,malloc但它也会初始化内存(用零字节填充它0x00)。

  • realloc占用已分配的内存并允许用户调整它的大小。

因此,在分配器及其不同实现的上下文中malloccallocrealloc并没有独立列出,因为每个分配器实现都需要自己的这些函数版本

jemalloc, ptmalloc, ...

当有人想要实现不同的分配器时,他不能(默认情况下可以但不应该)命名它,malloc因为它会与 C 标准库之一冲突。相反,他们通常给它一个不同的前缀,如jemallocptmallocnedmalloctcmalloc等。

值得一提的是,C 标准库本身也有多种实现,每个实现其分配器的方式都不同。因此malloc,根据编译代码时使用的标准库,将有不同的实现。例如:GNU C 标准库、MSVC 标准库等。

不同的分配器有什么区别?

要了解每种实现的确切优缺点,必须阅读每个实现的作者/作者编写的文档(如果存在),阅读代码以了解算法或阅读专家撰写的讨论该特定的文章/研究论文执行。

但是,如果我要对这些实现之间的差异进行分类,我会列出以下内容:

  1. 一些实现侧重于某些使用模式,并尝试对其进行优化,甚至以降低其他情况的效率为代价。一个例子是jemalloc他们专注于优化来自多个线程的分配以使其更快,但以使用更多内存为代价。这些类型的分配器通常是在对特定案例进行仔细调查后部署的,该案例表明它将从这种权衡中受益。
  2. 一些实现对分配器的使用进行了一定的限制,以使其更快。一个例子是单线程分配器,它将消除对同步对象的需要以使其更快。
  3. 其他实现尝试尽可能通用,并且不偏向于其他任何情况。此类别包括标准库中包含的默认分配器。
于 2019-03-23T09:10:37.733 回答