История изменений
Исправление KivApple, (текущая версия) :
Список может увеличиваться:
void *a = malloc(...);
void *b = malloc(...);
void *c = malloc(...);
...
free(b);
Допустим, конфигурация кучи такая, что a, b и c выделены последовательно. Теперь при освобождении b невозможно склеить ни со свободным блоком до него, ни после (потому что там вплотную a и c). Как следствие, образуется новый свободный блок.
Как я уже сказал, в моей реализации malloc имеет оверхед лишь sizeof(size_t), храня только размер блока, связанного списка выделенных блоков нет, только свободных. А вот free дописывает ещё указатель на следующий/предыдущий свободный блок перезаписывая первые байты данных в блоке.
А всякие SSE тут при том, что современные malloc возвращают адреса выделенные как минимум на 16 байт, потому что иначе сломается работа со структурами через некоторые векторные команды. И поэтому оптимизация с уменьшением заголовка занятого блока не так актуальна.
Исправление KivApple, :
Список может увеличиваться:
void *a = malloc(...);
void *b = malloc(...);
void *c = malloc(...);
...
free(b);
Допустим, конфигурация кучи такая, что a, b и c выделены последовательно. Теперь при освобождении b невозможно склеить ни со свободным блоком до него, ни после (потому что там вплотнуб a и c). Как следствие, образуется новый свободный блок.
Как я уже сказал, в моей реализации malloc имеет оверхед лишь sizeof(size_t), храня только размер блока, связанного списка выделенных блоков нет, только свободных. А вот free дописывает ещё указатель на следующий/предыдущий свободный блок.
А всякие SSE тут при том, что современные malloc возвращают адреса выделенные как минимум на 16 байт, потому что иначе сломается работа со структурами через некоторые векторные команды. И поэтому оптимизация с уменьшением заголовка занятого блока не так актуальна.
Исходная версия KivApple, :
Список может увеличиваться:
void *a = malloc(...);
void *b = malloc(...);
void *c = malloc(...);
...
free(b);
Допустим, конфигурация кучи такая, что a, b и c выделены последовательно. Теперь при освобождении b невозможно склеить ни со свободным блоком до него, ни после (потому что там вплотнуб a и c). Как следствие, образуется новый свободный блок.
Как я уже сказал, в моей реализации malloc имеет оверхед лишь sizeof(size_t), храня только размер блока, связанного списка выделенных блоков нет, только свободных. А вот free дописывает ещё указатель на следующий/предыдущий свободный блок.