【问题标题】:why is there no aligned calloc in C11为什么C11中没有对齐的calloc
【发布时间】:2014-05-30 07:59:35
【问题描述】:

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

为什么 C11 标准不包含分配零初始化对齐内存的 aligned_calloc 函数?

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

此外,一些操作系统(如 linux)以写时复制方式提供内存,与calloc 一起允许构造原始稀疏数据结构。在 aligned_alloc 的结果上初始化 memset 会破坏此属性。

在我看来,这些优势虽然不可移植,但应该足以拥有第二个对齐分配功能。

【问题讨论】:

  • 可能是因为设计是决定包含什么和省略什么的艺术,而这并不符合标准(尽管许多有问题的功能都符合要求)。无论如何,没有什么可以阻止任何实现提供它并更有可能包含在下一个标准中。
  • 不仅任何系统都可以免费提供aligned_calloc,而且您可能已经可以通过 mmap()ing /dev/zero 在许多系统上模拟该功能,这不会导致内存被提交立即。
  • 确保您也可以通过使用分配器从自定义 calloc 返回偏移量来自己对齐它,但是您不能将这个或 mmap 内存传递给 free,这与对齐的分配和 posix_memalign 分配的内存不同。但我想知道除了为了纯度而尽量减少新功能的数量之外,是否还有遗漏的原因。
  • 如果您要像 Pascal 建议的那样使用 mmap 自行开发,您只需使用 mmap(MAP_ANONYMOUS) 而不是实际打开 /dev/zero 并映射它。

标签: c dynamic-memory-allocation memory-alignment c11 calloc


【解决方案1】:

我能提供的最佳猜测是,aligned_calloc 专门违背了 C1X 章程的明确目标之一:

与 C9X 不同,伦敦会议上的共识是不应该 发明,无一例外。只有那些有历史和共同点的特征 应考虑由商业实施使用。还有一定要注意 以使标准和商业化的方式标准化这些功能 实现兼容。

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

纵观商业实现,aligned_malloc 广泛可用,并且在大多数平台上都很常见。对齐的 calloc 不仅需要在许多平台上进行包装,还需要提供比对齐的 malloc() + memset() 对更多的功能,因此可以被认为具有创造性,因此被排除在外。

这是我最好的猜测。

【讨论】:

  • 这是一个很好的答案,但不是很令人满意。它基本上提出了为什么特定平台首先不为此提供非标准 API 的问题。 AFAIK,甚至 Linux+glibc 都没有提供这样的功能。
猜你喜欢
  • 2013-01-17
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多