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