为什么在C11中没有对齐的calloc函数

22
C11标准添加了aligned_alloc函数,用于分配未初始化的对齐内存。标准还包括calloc函数,用于分配已初始化为零但仅将其对齐到最大类型大小的内存。

为什么C11标准没有包含一个aligned_calloc函数,该函数分配对齐的零初始化内存?

我知道您可以使用memset对结果进行初始化以获得初始化的内存,但是calloc函数在某些操作系统上非常有用,因为内核提供的内存通常必须出于安全原因已经被初始化为零(并对齐到页面大小)。 calloc可以利用这一点避免重复初始化。

此外,一些操作系统(例如Linux)提供以写入副本方式的内存,与calloc一起使用可构建基本稀疏数据结构。在aligned_alloc的结果上进行初始化memset会破坏此属性。

在我看来,尽管这些优势不具可移植性,但应足以具备第二个对齐分配函数。


2
可能是因为设计是决定包含什么和排除什么的艺术,而这个功能没有达到标准(尽管许多可疑用途的函数都有)。无论如何,没有任何阻止任何实现提供它并使其更有可能被纳入下一个标准。 - Deduplicator
不仅任何系统都可以自由提供aligned_calloc,而且您可能已经可以在许多系统上通过映射/dev/zero来模拟功能,这不应立即导致内存被提交。 - Pascal Cuoq
1
当然,您也可以通过使用分配器返回自定义calloc的偏移量来对齐它,但是与aligned_alloc和posix_memalign分配的内存不同,您无法将此内存传递给free。但是我想知道除了为了纯洁度而最小化新功能数量之外,是否有省略的原因。 - jtaylor
2
如果你要像Pascal建议的那样使用mmap,你只需要使用mmap(MAP_ANONYMOUS)而不是打开/dev/zero并映射它。 - Peter Cordes
1个回答

12
我能提供的最佳猜测是,aligned_calloc 明确违反了 C1X 议定书的一个目标:

与 C9X 不同,伦敦会议上的共识是,不应有任何发明,没有例外。只有那些历史悠久并被商业实现广泛使用的功能才应该考虑。此外,必须小心地将这些功能标准化,以使标准和商业实现兼容。

http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1250.pdf

在商业实现中查看时,aligned_malloc 在大多数平台上都是广泛可用且常见的。 一个 aligned calloc 将需要在许多平台上提供更多的封装,以提供超过 aligned_malloc() + memset() 组合的功能,因此可以被认为是创新的,因此被忽略了。

这应该是我的最佳猜测。


3
这是一个不错的回答,但并不令人满意。它基本上引出了一个问题,为什么特定平台一开始就没有为此提供非标准API。据我所知,甚至Linux+glibc也没有提供这样的函数。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接