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

jta*_*lor 17 c

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

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

我知道你可以忘记结果以获得初始化的内存,但该calloc函数在某些操作系统上非常有用,因为内核提供的内存通常必须已初始化为零(并且与页面大小对齐)以确保安全性. calloc可以利用这个并避免双重初始化.

另外,一些操作系统(如linux)以写时复制的方式提供存储器,同时calloc允许构造原始的稀疏数据结构.关于aligned_alloc破坏此属性的结果的初始化memset .

在我看来,这些优点虽然不便携,但应该足以具有第二个对齐的分配功能.

han*_*tmk 9

我可以提供的最佳猜测是,aligned_calloc特别违反了C1X章程的明确目标之一:

与C9X不同,伦敦会议的共识是没有任何发明,毫无例外.只应考虑那些具有历史并且通过商业实现共同使用的功能.此外,必须注意以一种使标准和商业实现兼容的方式标准化这些功能.

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

通过展望商业实现,aligned_malloc广泛可用,并且在大多数平台上都是通用的.对齐的calloc在许多平台上需要的不仅仅是包装,而是提供了比aligned_malloc()+ memset()对更多的东西,因此可以被认为是创造性的,因此被省略了.

那是我最好的猜测.

  • 这是一个很好的答案,但不是很令人满意。它基本上回避了为什么特定平台首先不为此提供非标准 API 的问题。AFAIK,甚至 Linux+glibc 都没有提供这样的功能。 (2认同)