LINUX.ORG.RU

Статистическое выделение памяти и степени числа 2


0

0

Очень часто в программах видны подобные строки

char lineBuffer [MAX_LINE_LENGHT];
double myArray [ARRAY_SIZE];

Обычно значениями констант MAX_LINE_LENGHT, ARRAY_SIZE и т.п. являются степени числа 2 (16, 32, 256, 1024 ...). Прав ли я? Если да - каковы причины такого выбора?

Спасибо

★★

1. силы привычки
2. недостаток опыта или лень для использования динам. массивов и структур
3. двоичная природа данных (алгоритмы которые с данными работают оптимальны при степени 2)
4. данные будут упаковываться для хранения или передачи, например в сетевых заголовках часто можно видеть что-то навроде
struct header {
  uint8_t flags:4;
  uint8_t length:4; // длинна данных ограничена 4 битами
  uint8_t data[];
}__attribute__((packed));

MKuznetsov ★★★★★
()

Ну, как бы степени двойки - они везде... В том числе и page при своппинге - это тоже степень двойки - типа 512 байт. Зачем, спрашивается, засовывать в своп почти полностью пустую страницу, если её, с другой стороны, можно выровнять по границе?

geekkoo
()
Ответ на: комментарий от MKuznetsov

Ну и для выравнивания может (для ускорения доступа).

anonymous
()
Ответ на: комментарий от geekkoo

И при размере буфера 129 257 будут укладываться 512 байт. Так что это скорее привычка со времен, когда еще людей волновали вопросы с чем проц обращается шустрее с машинным словом или с 1-м байтом.

iBliss
()

числа же круглые,
это как 10, 20 и т.д. в не компьютерном мире.

anonymous
()

Для больших массивов - удобно и правильно выбирать размер, кратный PAGE_SIZE (на i386 - 4096), так mmap-based аллокаторам легче жить.

для строчек human-readable- что-нибудь типа 255, чтобы, если что, индекс (длина) в char поместился (если на диск сохранить, скажем).

Опять же, если дампить это дело на диск - то при размерах, кратных странице, это удобнее потом ммапить.

В остальных случаях - просто привычка.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.