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