Два основных метода отслеживания размера объекта, о которых я знаю, неявно заключаются в выделенном по размеру распределителе с метаданными в стороне (например, в распределителе в стиле Кингсли) или в указании размера перед объектом какзаголовок объекта (например, dlmalloc).Довольно ужасным третьим решением было бы сохранение карты каждого выделенного объекта и его размера.Эта карта, конечно, будет управляться другим распределителем.
Я думаю, что вы на правильном пути, и это хорошо, что вы знаете о соображениях выравнивания.Я попытался найти некоторую информацию на mt_alloc, чтобы узнать, есть ли альтернативы или сюрпризы, но такая информация не всегда легко получить.У некоторых распределителей есть метод запроса размера объекта (который может быть или не быть дешевым).Если функция deallocate требует явной передачи размера, то я полагаю, что такой функции не существует, но вы никогда не узнаете.
Если выравнивание важно, ваш расчет нужно будет немного подправить, поскольку распределитель, вероятно, будетне вернуть память выровнен соответствующим образом для вас.Если вы ничего не знаете о выравнивании возвращаемых указателей, вам нужно что-то вроде:
struct object_header {
size_t size;
};
void * buf = xxmalloc (2 * alignment + size + sizeof(object_header));
void * alignedPtr = (void *) (((size_t) buf + sizeof(object_header) + alignment - 1) & ~(alignment - 1));
Если mt_alloc не может допустить освобождение объектов на внутренних указателях, то эта схема создает для вас проблему, потому что, добавляя дополнительное пространство длявыравнивание, вы больше не знаете, оригинальный адрес вернулся к вам.В этом случае вам может понадобиться сохранить дополнительное поле в заголовке.
В зависимости от того, как mt_alloc управляет внутренней памятью, добавление дополнительного заголовка также может привести к значительным накладным расходам.В распределенном по размеру распределителе использование этого заголовка может дать вам в 2 раза больше места на объектах до размера страницы, после чего вы можете заплатить до стоимости дополнительной страницы на объект.В других распределителях это может не быть проблемой, но на это нужно обратить внимание.