В стандарте C11 добавлена функция aligned_alloc для выделения неинициализированной выровненной памяти.
Стандарт также включает функцию calloc для выделения памяти, которая инициализируется нулем, но выравнивает ее только до размера самого большого типа.
Почему стандарт C11 не включает функцию aligned_calloc, которая выделяет выровненную память с нулевой инициализацией?
Я знаю, что вы можете просто перенести результат, чтобы получить инициализированную память, но функция calloc очень полезна в некоторых операционных системах, поскольку память, предоставляемая ядрами, часто должна быть уже инициализирована нолем (и выровнена по размеру страницы) для обеспечения безопасности причины.
calloc может использовать это и избегать двойной инициализации.
Кроме того, некоторые операционные системы (например, linux) обеспечивают память в режиме копирования на запись, что вместе с calloc позволяет создавать примитивные разреженные структуры данных. Инициализирующий memset в результате aligned_alloc уничтожает это свойство.
Мне кажется, что этих преимуществ, хотя и не портативных, должно быть достаточно, чтобы иметь вторую выровненную функцию выделения.