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