Подтвердить что ты не робот

Влияние производительности realloc()

У меня есть список записей, при запуске я не знаю количества записей. Мне нужно прочитать их в массиве. поэтому желательно читать все записи по одному и делать realloc один за другим и продолжать увеличивать размер массива по мере того, как элемент приходит ИЛИ я должен потратить один проход на идентификацию количества записей и сделать malloc только один раз? Какой из них будет стоить менее дорогостоящим?

4b9b3361

Ответ 1

A realloc на самом деле не очень дорого. Но вызов realloc для каждого элемента немного. Я предлагаю вам сделать это:

  • Начните с размера
  • Когда вы добавляете элемент, проверьте, достаточно ли свободного места.
  • Если у вас недостаточно места, удвойте количество денег

Правильное угадывание адекватного начального размера также помогает. Так что если 60% ваших входов меньше 100 записей, начните с этого.

Ответ 2

Это обычная техника удвоить размер массива всякий раз, когда он становится заполненным, как отмечали другие. Фактически, использование этого метода гарантирует, что на элемент затрачивается не более, чем постоянное количество времени, как объясняется в WikiPedia.

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

Ответ 3

Вы не должны realloc( ) один за другим.

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

Ответ 4

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