今天读了Rust subreddit,我发现了以下评论:
jemalloc针对(多线程)速度而非内存使用进行了优化
经过更多的研究后,我发现还有更多的选择(比如calloc)。
我想了解不同内存分配器的优缺点是什么?
如果这个问题看起来很愚蠢,我的背景主要是解释语言(不会暴露这种细粒度的内存控制)。
malloc
,calloc
和realloc
这些功能不是不同的分配器。它们是从同一分配器请求内存的不同方式。
malloc
提供内存而不初始化它(填充了之前用户存储的内容)。calloc
与malloc
相同,但它也会初始化内存(用零字节0x00
填充它)。realloc
获取已分配的内存并允许用户调整大小。因此,在分配器及其不同实现的上下文中,malloc
,calloc
和realloc
未单独列出,因为每个分配器实现都需要其自己的这些函数版本。
jemalloc
,ptmalloc
,...当有人想要实现不同的分配器时,他不能(可以但不应该默认)将其命名为malloc
,因为它将与C标准库冲突。相反,他们通常给它一个不同的前缀,如jemalloc,ptmalloc,nedmalloc,tcmalloc和others。
值得一提的是,C标准库本身也有多种实现方式,每种方法都会以不同的方式实现其分配器。因此,malloc
将根据编译代码时使用的标准库进行不同的实现。例如:GNU C标准库,MSVC标准库等。
要了解每个实现的确切优缺点,必须阅读每个实现的作者/作者所编写的文档(如果存在),阅读代码以理解算法或阅读由专家撰写的文章/研究论文实现。
但是,如果我要对这些实现之间的差异进行分类,我会列出以下内容:
jemalloc
,他们专注于优化多线程的分配以使其更快,但代价是使用更多内存。这些类型的分配器通常是在对特定案例进行仔细调查后部署的,这些案例表明它将从这种权衡中获益。