То, как вы увеличиваете свой буфер, довольно неэффективно. Для каждого небольшого фрагмента строки вы используете realloc () память, что может означать выделение новой памяти и копирование содержимого «старой» памяти. Это медленно и фрагментирует вашу кучу.
Лучше вырасти в фиксированных количествах или в фиксированных процентах, то есть сделать новый размер в 1,5 или 2 раза больше старого. Это также приводит к бесполезной трате памяти, но делает кучу более удобной в использовании и делает не так много копий.
Это означает, что вам придется отслеживать два значения: емкость (количество выделенных байтов) и длину (фактическая длина строки). Но это не должно быть слишком сложно.
Я бы ввел функцию "FstrBuf_Grow", которая позаботится обо всем этом. Вы просто называете это с объемом памяти, который хотите добавить, и FstrBuf_Grow
позаботится о том, чтобы емкость соответствовала требованиям, перераспределяя при необходимости и, по крайней мере, столько, сколько необходимо.
...
void FstrBuf_Grow(FstringBuf *buf, size_t more)
{
while (buf->length + more) > buf->capacity
buf->capacity = 3 * buf->capacity / 2;
buf->data = realloc(buf->data, buf->capacity + 1);
}
Это умножает capacity
на 1,5, пока data
не станет достаточно большим. Вы можете выбирать разные стратегии в зависимости от ваших потребностей.