
Простой макрос
Все началось с простого макроса: (приблизительный код)
#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 байт).
Мы добавляем байты в динамический буфер — это одна из наиболее распространенных операций практически в любой программе (для работы со строками, массивами и т. п.).
Но как понять, насколько эффективна стратегия перераспределения?Читать полностью »