Как правило, лучше предварительно выделить в «начальном» фиксированном размере, а когда вам не хватит места, перераспределить на основе фактора роста.
В зависимости от ваших потребностей начальный размер и коэффициент роста могут быть определены на основе типичного использования данных, с которыми вы работаете, или API, который вы создаете для своих данных, может позволить вызывающей стороне указать начальный размер и коэффициент роста как часть вызова инициализации / создания.
Начальный размер должен быть числом, основанным на типичном использовании. Типичное использование является важным фактором, который помогает вам выбрать размер, так что вы: A) не тратите пространство, выбирая слишком большой начальный размер, и B) не используете начальный размер, слишком маленький для того, чтобы было много перераспределений будет необходимо, пока целевой размер не будет достигнут.
Типичный размер, конечно же, магическое число. Способ определения типичного размера состоит в том, чтобы запустить некоторые тесты с использованием различных наборов данных и собрать статистику для начального размера, количества перераспределений и минимального / максимального использования памяти для ваших данных. Вы можете усреднить результаты, чтобы получить полезный типичный начальный размер.
Что касается фактора роста, то коэффициент роста х1,5 или х2 является обычным явлением. Это то, что вы можете измерить, используя статистику теста, как с начальным размером.
Еще одна вещь, которую следует учитывать, это то, что вам нужно быть осторожным при управлении ссылками на динамически изменяемые данные, поскольку realloc () будет перемещать данные в памяти при необходимости. Это означает, что если вы сохранили адрес первого элемента динамически изменяемого размера массива, этот адрес может быть недействительным после вызова realloc. Это может управляться API-оболочкой вокруг вашего пользовательского типа данных, которая раздает индексы вместо адресов памяти и может при необходимости преобразовать индекс в текущий адрес элемента.