Один большой malloc против нескольких меньших Reallocs

StackOverflow https://stackoverflow.com/questions/4008128

Вопрос

Извините, если это спросило раньше, я не смог найти только то, что я ищу.

Я читаю поля из списка и пишу их в блок памяти. Я мог бы

  • Пройдите весь список, найдите общий необходимый размер, сделайте один malloc а затем снова пройдите список и скопируйте каждое поле;
  • Пройти весь список и realloc блок памяти, как я пишу значения;

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

Спасибо за уделенное время.

Это было полезно?

Решение

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

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

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

В качестве примера изначально выделяют 100к. Если вы тогда найдете, вам нужно больше, переоскатайте на 200 тыс., Даже если вам нужно всего 101k.

Другие советы

Первый подход почти всегда лучше. RealLOC () обычно работает, копируя все содержимое блока памяти в свежесемя, больший блок. Так N. RealLocs может означать копии, каждый больше, чем последний. (Если вы добавляете M BYTES в свое распределение каждый раз, то первый Realloc должен копировать M BYTES, следующий 2м, следующий 3M, ...).

Педантический ответ заключался в том, что внутренние последствия эффективности Realloc () являются конкретными в реализации, а не явно определены стандартом, в некоторой реализации он может работать в Magic Faies, которые мгновенно перемещают байты, но и в любой реалистичной реализации. Realloc () означает копию.

Не изобретайте колесо и используйте CCAN's darray который реализует подход, похожий на то, что описано Pakdiablo. Видеть Darray на Github

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top