C11标准添加了
aligned_alloc
函数,用于分配未初始化的对齐内存。标准还包括calloc
函数,用于分配已初始化为零但仅将其对齐到最大类型大小的内存。
为什么C11标准没有包含一个aligned_calloc
函数,该函数分配对齐的零初始化内存?
我知道您可以使用memset对结果进行初始化以获得初始化的内存,但是calloc
函数在某些操作系统上非常有用,因为内核提供的内存通常必须出于安全原因已经被初始化为零(并对齐到页面大小)。 calloc
可以利用这一点避免重复初始化。
此外,一些操作系统(例如Linux)提供以写入副本方式的内存,与calloc
一起使用可构建基本稀疏数据结构。在aligned_alloc
的结果上进行初始化memset会破坏此属性。
在我看来,尽管这些优势不具可移植性,但应足以具备第二个对齐分配函数。
aligned_calloc
,而且您可能已经可以在许多系统上通过映射/dev/zero
来模拟功能,这不应立即导致内存被提交。 - Pascal Cuoqmmap
,你只需要使用mmap(MAP_ANONYMOUS)
而不是打开/dev/zero
并映射它。 - Peter Cordes