使用jemalloc vs malloc vs calloc和其他常见替代品有哪些优点和缺点?

问题描述 投票:3回答:1

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

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

经过更多的研究后,我发现还有更多的选择(比如calloc)。

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

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

malloc dynamic-memory-allocation realloc calloc jemalloc
1个回答
0
投票

malloccallocrealloc

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

  • malloc提供内存而不初始化它(填充了之前用户存储的内容)。
  • callocmalloc相同,但它也会初始化内存(用零字节0x00填充它)。
  • realloc获取已分配的内存并允许用户调整大小。

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

jemallocptmalloc,...

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

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

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

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

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

  1. 一些实现关注于某些使用模式,并尝试优化它们,甚至以降低其他情况的效率为代价。这方面的一个例子是jemalloc,他们专注于优化多线程的分配以使其更快,但代价是使用更多内存。这些类型的分配器通常是在对特定案例进行仔细调查后部署的,这些案例表明它将从这种权衡中获益。
  2. 一些实现对分配器的使用施加了一定的限制,以使其更快。一个例子是单线程分配器,它将消除对同步对象的需求,使其更快。
  3. 其他实现尝试尽可能通用,并且不支持任何其他情况。此类别包括标准库中包含的默认分配器。
© www.soinside.com 2019 - 2024. All rights reserved.