Основная проблема заключается в том, что вы предоставляете только общий размер блока памяти malloc()
и друзьям, без какой-либо информации о гранулярности объекта. Если вы рассматриваете выделение как массив объектов, то у вас есть размер, равный размеру базового объекта, и число n, равное количеству объектов в массиве, например ::10000
p = malloc(sizeof(*p) * n);
Если у вас есть только общий размер, то вы не знаете, если s = 4 и n = 10, или если s = 2 и n = 20, или s = 1 и n = 40, потому что все умножаются на общий размер 40 байт.
Итак, основной вопрос в том, хотите ли вы прямую замену оригинальным функциям, например, когда вы перебрасываете собственные вызовы по всей вашей кодовой базе или у вас есть централизованная и СУХАЯ модульность с функциями-обертками. Там вы можете использовать функции, которые предоставляют s и n.
void *my_malloc (size_t s, size_t n)
Большую часть времени это должна быть безопасная ставка, когда возвращаемый абсолютный адрес памяти кратен s, чтобы гарантировать правильное выравнивание.
В качестве альтернативы, при переносе вашей реализации вы просто смотрите на выравнивание, которое нативный malloc()
использует для целевой платформы (например, кратно 16), и используете его для своей собственной реализации.