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

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

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

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

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

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


person jtaylor    schedule 15.04.2014    source источник
comment
Вероятно, потому что дизайн — это искусство решать, что включить, а что убрать, и это не соответствовало планке (хотя многие функции сомнительного использования соответствовали). Во всяком случае, ничто не мешает любой реализации предоставить его и сделать включение в следующий стандарт более вероятным.   -  person Deduplicator    schedule 15.04.2014
comment
Не только любая система может предоставить aligned_calloc, но вы, вероятно, уже можете эмулировать функциональность на многих системах с помощью mmap(), используя /dev/zero, что не должно приводить к немедленной фиксации памяти.   -  person Pascal Cuoq    schedule 15.04.2014
comment
конечно, вы также можете выровнять его самостоятельно, вернув смещение из пользовательского calloc с помощью распределителя, но вы не можете передать это или mmap память для освобождения, в отличие от выделенной памятиalign_alloc и posix_memalign. Но мне интересно, есть ли причина для упущения помимо минимизации количества новых функций ради чистоты.   -  person jtaylor    schedule 16.04.2014
comment
Если вы собираетесь свернуть свой собственный с mmap, как предлагает Паскаль, вы должны просто использовать mmap(MAP_ANONYMOUS), а не открывать /dev/zero и отображать его.   -  person Peter Cordes    schedule 24.04.2017


Ответы (1)


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

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

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

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

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

person hanumantmk    schedule 18.04.2014
comment
Это хороший ответ, но не очень удовлетворительный. В основном возникает вопрос, почему конкретные платформы вообще не предоставляют для этого нестандартный API. Насколько я знаю, даже Linux + glibc не предоставляют такой функции. - person Peter Cordes; 24.04.2017