Максимальные значения размеров массива в C - PullRequest
0 голосов
/ 17 сентября 2010

Просто быстрый вопрос: какова практика людей, когда нужно определить (произвольный) максимум, который может принимать какой-либо массив в C. Итак, некоторые люди просто выбирают круглое число, надеясь, что оно будет достаточно большим, другие - простым числом ближе к круглому числу (!) и т. д., другое, более эзотерическое число, например простое число, ближе к ... и т. д.

Мне вот интересно, каковы некоторые лучшие практики для определения таких значений?

Спасибо.

Ответы [ 7 ]

5 голосов
/ 18 сентября 2010

Если я не могу определить разумный максимум, я склонен использовать malloc и realloc для увеличения массива по мере необходимости. Использование массива фиксированного размера, когда вы не можете гарантировать, что он достаточно большой для предполагаемой цели, опасно.

5 голосов
/ 17 сентября 2010

Нет общего правила. Сила двойок работает для буферов, я довольно часто использую 1024 для строковых буферов в C, но подойдет любое другое число. Простые числа полезны для хеш-таблиц, где простое модульное хеширование хорошо работает с размерами простых чисел. Конечно, вы определяете размер как символическую константу, чтобы вы могли изменить его позже.

3 голосов
/ 18 сентября 2010

Лучшая практика - избегать произвольных ограничений, когда это возможно.

Это не всегда возможно, поэтому вторая лучшая практика состоит в том, чтобы получить образованную оценку самой большой вещи, которую массив, возможно, когда-либо понадобится, и затем округлить с достаточным запасом, по крайней мере, на 25%. Когда я делаю это, я предпочитаю использовать степени десяти, потому что при проверке становится очевидным, что число является произвольным пределом. (Степени двойки также часто означают это, но только в том случае, если читатель распознает число как степень двух, и большинство читателей кода не запоминают эту таблицу намного позже 2 16 . Если есть хорошая причина для использования степени двойки, и она должна быть больше этой суммы, запишите ее в шестнадцатеричном виде. Конец отступления.) Всегда документируйте обоснование своей оценки самой большой вещи, которую должен содержать массив, даже если это так просто поскольку «любому, у кого один исходный файл больше 2 ГБ, необходимо переосмыслить свой стиль кодирования» ( фактический пример )

Не используйте простое число, если вам специально не нужны свойства простого числа (например, как упоминает Юхо, для хеш-таблиц - но вам это нужно только в том случае, если ваша хеш-функция не очень хороша - но часто к сожалению, это так.) Когда вы это сделаете, задокументируйте, что вы намеренно используете простые числа и почему, потому что большинство людей не распознают простые числа сразу или не знают, почему они могут быть необходимы в конкретной ситуации.

0 голосов
/ 18 сентября 2010

В самом начале невозможно предсказать, каким может быть максимальный размер.

Например, я кодировал небольшой интерпретатор cmdline, в котором каждая полученная строка сохранялась в массиве символов размером 200 . Достаточно для всех возможных выходов, не так ли?

Это было до тех пор, пока я не выполнил команду env, в которой была строка с ~ 400 символами (!).

LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;
05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;
32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;
31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;
35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:';

Мораль истории: Постарайтесь использовать динамическое распределение насколько это возможно.

0 голосов
/ 18 сентября 2010

Используются круглые числа (степени 2), потому что они часто легко используются такими вещами, как malloc (многие реализации идут в ногу с памятью в блоках различной степени двух размеров), проще для использования компоновщиками (в случае статические или глобальные массивы), а также потому, что вы можете использовать побитовые операции для проверки их пределов, которые часто быстрее, чем <и>.

Простые числа используются, поскольку предполагается, что использование хеш-таблиц размером с простым числом позволяет избежать коллизий.

Многие люди, вероятно, используют как простое число, так и степень двух размеров для вещей в тех случаях, когда они на самом деле не дают никакой выгоды.

0 голосов
/ 18 сентября 2010

Я определяю максимум только тогда, когда у меня есть веские основания для того, чтобы конкретное число было максимумом. В противном случае я измеряю его динамически, возможно, с максимальной проверкой работоспособности (например, имя человека не должно быть длиной несколько мегабайт).

0 голосов
/ 18 сентября 2010

Если мне нужно сделать это, я обычно использую либо степень двойки, либо для больших наборов данных - количество страниц, необходимое для хранения данных. Хотя в большинстве случаев я предпочитаю выделять часть памяти в куче, а затем перераспределять ее, если позже размер буфера будет недостаточным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...