Динамически выделять или тратить память? - PullRequest
4 голосов
/ 24 мая 2011

У меня есть двумерный целочисленный массив, используемый для карты тайлов.

Размер карты неизвестен и считывается из файла во время выполнения. в настоящее время самый большой файл - 2500 элементов (сетка 50x50).

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

Знают ли люди о плюсах или минусах того или иного решения? любые советы или личные мнения приветствуются.

с ++ кстати

edit: все карты сделаны мной, поэтому я могу выбрать максимальный размер.

Ответы [ 5 ]

9 голосов
/ 24 мая 2011

Вероятно, самый простой способ - это, например, std::vector<std::vector<int> >, чтобы позволить ему иметь динамический размер И позволить библиотеке делать все выделения за вас. Это предотвратит случайную утечку памяти.

2 голосов
/ 24 мая 2011

Это полностью зависит от требований, которые вы не заявили: -)

  • Если вы хотите, чтобы ваше приложение было максимально быстрым, без возможности обрабатывать большие карты тайлов, тогда во что бы то ни стало просто используйте большой массив. Для небольших встроенных систем на основе ПОС это может быть идеальным подходом.

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

  • Или, если вы просто хотите что-то изучать и не заботитесь о поддержке или производительности, попробуйте написать свои собственные динамически размещаемые контейнеры с нуля.

2 голосов
/ 24 мая 2011

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

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

1 голос
/ 24 мая 2011

Является ли выделение памяти динамически узким местом в вашей программе?Это причина проблемы с производительностью?Если нет, то просто сохраняйте динамическое размещение, вы можете обрабатывать карты любого размера.Если да, то, возможно, используйте некоторую структуру данных, которая не освобождает выделенную память, а использует старый буфер и, если необходимо, перераспределяет больше памяти.

1 голос
/ 24 мая 2011

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

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

...