Почему в C11 нет выровненного calloc

В стандарте C11 добавлена ​​функция aligned_alloc для выделения неинициализированной выровненной памяти. Стандарт также включает функцию calloc для выделения памяти, которая инициализируется нулем, но выравнивает ее только до размера самого большого типа.

Почему стандарт C11 не включает функцию aligned_calloc, которая выделяет выровненную память с нулевой инициализацией?

Я знаю, что вы можете просто перенести результат, чтобы получить инициализированную память, но функция calloc очень полезна в некоторых операционных системах, поскольку память, предоставляемая ядрами, часто должна быть уже инициализирована нолем (и выровнена по размеру страницы) для обеспечения безопасности причины. calloc может использовать это и избегать двойной инициализации.

Кроме того, некоторые операционные системы (например, linux) обеспечивают память в режиме копирования на запись, что вместе с calloc позволяет создавать примитивные разреженные структуры данных. Инициализирующий memset в результате aligned_alloc уничтожает это свойство.

Мне кажется, что этих преимуществ, хотя и не портативных, должно быть достаточно, чтобы иметь вторую выровненную функцию выделения.

Ответ 1

Лучшее предположение, которое я мог бы предложить, заключается в том, что aligned_calloc специально идет против одного из явных целей чартера C1X:

В отличие от C9X, консенсус на лондонской встрече состоял в том, что не должно быть никаких     изобретение, без исключения. Только те функции, которые имеют историю и являются общими     использование коммерческой реализации должно быть рассмотрено. Также необходимо проявлять осторожность     стандартизировать эти функции таким образом, чтобы сделать Стандарт и коммерческую     совместимость по осуществлению.

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

Оглядываясь на коммерческие реализации, aligned_malloc был широко доступен и распространен для большинства платформ. Выровненный calloc потребовал бы больше, чем обертывание на многих платформах, чтобы предлагать больше, чем пара с aligned_malloc() + memset(), поэтому его можно было бы считать изобретательской и, таким образом, не учитывать.

Это было бы мое лучшее предположение.