Стандарт C11 добавил функцию aligned_alloc
для выделения неинициализированной выровненной памяти. Стандарт также включает функцию calloc
для выделения памяти, которая инициализируется нулем, но только выравнивает ее по размеру самого большого типа.
Почему стандарт C11 не включает функцию aligned_calloc
, которая выделяет выровненную память, инициализированную нулем?
Я знаю, что вы можете просто memset результат, чтобы получить инициализированную память, но функция calloc
очень полезна в некоторых операционных системах, так как память, предоставляемая ядрами, часто уже должна быть инициализирована нулями (и выровнена по размеру страницы) по соображениям безопасности. calloc
может использовать это и избежать двойной инициализации.
Кроме того, некоторые операционные системы (например, Linux) предоставляют память в режиме копирования при записи, что вместе с calloc
позволяет создавать примитивные разреженные структуры данных. Инициализация memset для результата aligned_alloc
уничтожает это свойство.
Мне кажется, что этих преимуществ, хотя и не переносимых, должно быть достаточно, чтобы иметь вторую выровненную функцию распределения.
aligned_calloc
, но вы, вероятно, уже можете эмулировать функциональность на многих системах с помощью mmap(), используя /dev/zero, что не должно приводить к немедленной фиксации памяти. - person Pascal Cuoq   schedule 15.04.2014mmap
, как предлагает Паскаль, вы должны просто использоватьmmap(MAP_ANONYMOUS)
, а не открывать/dev/zero
и отображать его. - person Peter Cordes   schedule 24.04.2017