Если я скажу calloc (1000, 23), 23 округляется до 24?Или до 32? - PullRequest
3 голосов
/ 04 января 2011

Мне было интересно, большинство реализаций calloc также рассматривают размер как выравнивание и округляют его до следующей поддерживаемой гранулярности?

Если так, то округляют ли они до следующей степени2 или они округляются до следующего кратного 8 или 16?

Если calloc сохраняет параметр таким же, то как это вообще работает?Разве ваши данные не будут выровнены?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 04 января 2011

sizeof определено для получения размера объекта в массиве - другими словами, он уже учитывает любые отступы, необходимые для правильного выравнивания.Так что если sizeof(foo) равно 23 для какого-то объекта foo, то ваш процессор должен быть выровнен по байту.(С другой стороны, если вы проезжаете 23, потому что вы просто думаете, что это хорошая цена, тогда удачи вам; вы в одиночестве.)

3 голосов
/ 04 января 2011

Что касается выравнивания, calloc(1000, 23) точно эквивалентно malloc(1000 * 23). Если реализация решит каким-то образом «выровнять» размер, она будет привязывать общий размер 23000 к некоторому большему значению, определенному реализацией. Никакой специальной обработки не применяется ко второму параметру calloc (или к первому, в этом отношении).

Привязка 23 к 24 в calloc(1000, 23) действительно означала бы привязку 23000 к 24000 (с точки зрения общего размера). Нет разумной практической реализации, которая бы потребовала добавления всего 1000 для выравнивания.

...