今天阅读Rust subreddit我发现了以下评论:
jemalloc针对(多线程)速度而非内存使用进行了优化
在做了更多的研究之后,我发现还有更多的选择(比如calloc)。
我想了解不同内存分配器的优缺点是什么?
如果这个问题看起来很愚蠢,我的背景主要是解释语言(不会暴露这种精细的谷物记忆控制)。
答案 0 :(得分:0)
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
就是一个例子,他们专注于优化来自多个线程的分配以使其更快,但以使用更多的内存为代价。这些类型的分配器通常是在仔细调查特定案例后才部署的,这些案例表明它将受益于这种权衡。