【发布时间】: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