¿Por qué no hay calloc alineado en C11

El estándar C11 agregó la función aligned_alloc para asignar memoria alineada no inicializada. El estándar también incluye la función calloc para asignar memoria que se inicializa a cero pero solo la alinea con el tamaño del tipo más grande.

¿Por qué el estándar C11 no incluye una función aligned_calloc que asigna memoria alineada que se inicializa con cero?

Soy consciente de que solo puede hacer que el resultado se inicialice para obtener la memoria inicializada, pero la función calloc es muy útil en algunos sistemas operativos, ya que la memoria proporcionada por los núcleos a menudo ya debe tener cero inicialización (y estar alineada con el tamaño de la página) por razones de seguridad. calloc puede hacer uso de esto y evitar la doble inicialización.

Además, algunos sistemas operativos (como Linux) proporcionan memoria en forma de copia en escritura que, junto con calloc permite construir estructuras de datos dispersos primitivos. Un memset de inicialización sobre el resultado de aligned_alloc destruye esta propiedad.

Me parece que estas ventajas, aunque no son portátiles, deberían ser suficientes para tener una segunda función de asignación alineada.

La mejor conjetura que puedo ofrecer es que align_calloc va específicamente en contra de uno de los objectives explícitos de la carta de C1X:

A diferencia de C9X, el consenso en la reunión de Londres fue que no debería haber inventos, sin excepción. Solo aquellas características que tienen un historial y son de uso común por una implementación comercial deben ser consideradas. También se debe tener cuidado de estandarizar estas características de manera que el estándar y la implementación comercial sean compatibles.

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

Al observar las implementaciones comerciales, align_malloc estaba ampliamente disponible y era común para la mayoría de las plataformas. Un calloc alineado habría requerido más que envolver en muchas plataformas para ofrecer más que el par align_malloc () + memset (), por lo que podría considerarse inventivo y, por lo tanto, se dejó de lado.

Esa sería mi mejor conjetura.