使用jemalloc vs malloc vs calloc和其他常见替代品有什么优势和劣势?

时间:2017-09-16 09:07:22

标签: malloc dynamic-memory-allocation realloc calloc jemalloc

今天阅读Rust subreddit我发现了以下评论:

  

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

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

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

如果这个问题看起来很愚蠢,我的背景主要是解释语言(不会暴露这种精细的谷物记忆控制)。

1 个答案:

答案 0 :(得分:0)

malloccallocrealloc

这些功能不是不同的分配器。它们是从同一分配器请求内存的不同方法。

  • malloc提供的内存无需初始化(填充了先前存储在其中的任何用户)。

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

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

因此,在分配器及其不同的实现方式中,malloccallocrealloc并未独立列出,因为每个分配器实现都需要它们自己的版本功能

jemallocptmalloc,...

当某人想要实现一个不同的分配器时,他不能(默认但不能)将其命名为malloc,因为它将与C标准库冲突。相反,他们通常给它一个不同的前缀,例如jemallocptmallocnedmalloctcmallocothers

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

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

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

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

  1. 某些实现专注于某些使用模式,并尝试针对它们进行优化,即使以降低其他情况的效率为代价。 jemalloc就是一个例子,他们专注于优化来自多个线程的分配以使其更快,但以使用更多的内存为代价。这些类型的分配器通常是在仔细调查特定案例后才部署的,这些案例表明它将受益于这种权衡。
  2. 某些实现对分配器的使用设置了一定的限制,以使其更快。单线程分配器就是一个例子,它将消除对同步对象的需求,以使其更快。
  3. 其他实现尝试尽可能地达到通用目的,并且不希望任何情况都比其他实现更有利。此类别包括标准库中包含的默认分配器。