Один большой malloc против нескольких меньших realloc - PullRequest
1 голос
/ 24 октября 2010

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

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

  • просмотреть весь список, найти общий необходимый размер, сделать один malloc, а затем снова пройти список и скопировать каждое поле;1009 * блок памяти, когда я записываю значения;

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

Спасибо, что уделили время.

Ответы [ 3 ]

2 голосов
/ 24 октября 2010

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

Педантичный ответ будет таким:Внутреннее влияние realloc () на производительность зависит от конкретной реализации, явно не определенной стандартом, в некоторых реализациях он может работать волшебными феями, которые мгновенно перемещают байты, и т. д. и т. д., но в любой реалистичной реализации realloc () означает копию.

1 голос
/ 24 октября 2010

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

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

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

В качестве примера, первоначально выделите 100K.Если вы обнаружите, что вам нужно больше, перераспределите на 200 КБ, даже если вам нужен только 101 КБ.

0 голосов
/ 13 июня 2012

Не изобретайте колесо и используйте CCAN darray, который реализует подход, аналогичный описанному в paxdiablo. Смотрите Дарри на GitHub

...