защо няма подравнен calloc в C11

Стандартът 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()ing /dev/zero, което не би трябвало да доведе до незабавно ангажиране на паметта.   -  person Pascal Cuoq    schedule 15.04.2014
comment
със сигурност можете също да го подравните сами, като върнете отместване от персонализиран calloc с помощта на разпределител, но не можете да предадете това или mmap памет за освобождаване, за разлика от aligned_alloc и posix_memalign разпределената памет. Но се чудя дали има причина за пропуска, освен минимизиране на броя на новите функции заради чистотата.   -  person jtaylor    schedule 16.04.2014
comment
Ако възнамерявате да превъртите свой собствен с mmap, както предлага Паскал, просто бихте използвали mmap(MAP_ANONYMOUS), вместо всъщност да отваряте /dev/zero и да го мапирате.   -  person Peter Cordes    schedule 24.04.2017


Отговори (1)


Най-доброто предположение, което мога да предложа, е, че aligned_calloc конкретно противоречи на една от изричните цели на C1X хартата:

За разлика от C9X, консенсусът на срещата в Лондон беше, че не трябва да има изобретения без изключения. Трябва да се вземат предвид само тези функции, които имат история и се използват често от търговско изпълнение. Също така трябва да се внимава да се стандартизират тези функции по начин, който да направи стандарта и търговската реализация съвместими.

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

Разглеждайки комерсиалните реализации, aligned_malloc беше широко достъпен и общ за повечето платформи. Един подравнен calloc би изисквал повече от обвиване на много платформи, за да предложи повече от двойката aligned_malloc() + memset(), поради което може да се счита за изобретателен и следователно е пропуснат.

Това би било най-доброто ми предположение.

person hanumantmk    schedule 18.04.2014
comment
Това е добър отговор, но не е много задоволителен. По същество това повдига въпроса защо определени платформи не предоставят нестандартен API за това на първо място. AFAIK, дори Linux+glibc не предоставя такава функция. - person Peter Cordes; 24.04.2017