Простой макрос
Все началось с простого макроса: (приблизительный код)
#define ADD_BYTE(C) do { \
if (offset == capa) { \
if (capa < 16) { \
capa = 16; \
} else { \
capa <<= 1; \
} \
buffer = realloc(buffer, capa); \
assert(buffer != NULL); \
} \
buffer[offset++] = (C); \
} while(0)
Для тех, кто не знаком с языком программирования C, поясню: этот простой макрос добавляет байт «C» в динамически выделяемый буфер (buffer), размер которого (в байтах) равен capa. Следующая позиция для записи определяется при помощи параметра offset. При каждом заполнении буфера происходит двукратное увеличение его объема (начиная с минимального размера в 16 байт).
Мы добавляем байты в динамический буфер — это одна из наиболее распространенных операций практически в любой программе (для работы со строками, массивами и т. п.).
Но как понять, насколько эффективна стратегия перераспределения?