Как можно разрешить целые числа в моем классе контейнера? - PullRequest
1 голос
/ 22 марта 2011

Я не хочу, чтобы класс вызывал сбой из-за слишком большого количества значений. Я понимаю, что потребовалось бы 268 435 456 целых чисел (если я правильно сделал свою математику), чтобы занять один гигабайт (что довольно экстремально). Это значение является лишь восьмой от максимального значения целого числа со знаком (которое я сейчас использую для длины. Должен ли я поставить ограничение на это? Если да, то какое будет разумное число? unsigned short - разумная длина? Вам когда-нибудь нужен был массив с более чем 65 536 значениями?

Ответы [ 4 ]

11 голосов
/ 22 марта 2011

Установление произвольных ограничений для ваших классов считается плохой практикой.

Вы должны разрешить пользователю помещать столько вещей, сколько они хотят, в ваш контейнер;если они попытаются добавить слишком много, то их работа заключается в том, чтобы исключить исключение std::bad_alloc.

1 голос
/ 22 марта 2011

Вам когда-нибудь был нужен массив с более чем 65 536 значений?

У меня на жестком диске тонны файлов, которые намного больше этого (вспоминаются mp3-файлы и некоторые исполняемые файлы).

Могу ли я хотеть целый файл в памяти за один раз? Конечно.

Предложения для всего приложения

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

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

Как правило, вы должны проверять пользовательский ввод (включая входные файлы, значения, передаваемые в полях, значения, передаваемые в функциях и т. Д.) И устанавливать искусственные (но достаточно большие) ограничения на эти значения. Затем оставьте свой внутренний код свободным, чтобы расти по мере необходимости. Это значительно облегчает тестирование вашей программы, поскольку у вас есть целевое значение "maxs out", по которому вы хотите стрелять. Вы можете проверить и с уверенностью сказать, что поддерживаете эти верхние пределы, а также можете проверить обработку ошибок, когда пользователь использует значения выше этих пределов.

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

Предложения для простых / низших классов

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

Пользователь должен правильно использовать ваш код, чтобы он не вызвал исключение. Код в вашем классе также не должен пытаться перехватить это исключение из нехватки памяти, так как ваш код почти наверняка не сможет восстановиться изящно.

0 голосов
/ 22 марта 2011

Обычно ожидается, что контейнеры общего назначения не будут налагать произвольные ограничения на клиента. Если вы беспокоитесь об экономии памяти - думая, что ваш клиентский кодер (пользователь кода вашей библиотеки «библиотеки») будет обеспокоен - тогда подумайте над тем, чтобы предоставить им выбор, сделав его параметром шаблона. Недостатком является то, что вы можете получить несколько типов контейнеров и шаблонов для одного типа значения. В общем, ничего страшного. И в целом, не более вероятно, что клиент случайно вставит слишком много элементов в ваш контейнер, чем то, что он случайно пропустит память в цикле где-нибудь или умножит размер для своего выделения кучи на некоторый MB_MULTIPLIER дважды случайно. Если они обеспокоены, пусть пишут if (container.size() > 65535) throw "not likely mate";. Вы просто не можете бороться с некоторыми видами неправильного использования клиентов и должны позволить им сделать это правильно во время разработки и тестирования.

0 голосов
/ 22 марта 2011

Я использовал логические массивы (тип bool) с емкостью 20000000 .

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

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