Цель
Я пишу небольшую библиотеку для более крупного проекта, которая предоставляет функции-оболочки malloc/realloc/free, а также функцию, которая может сказать вам, соответствует ли ее параметр (типа void *
) активной (еще не освобожденной) выделенной памяти и управляется библиотечными функциями-оболочками. Назовем эту функцию isgood_memory
.
Внутри библиотека поддерживает хеш-таблицу, чтобы гарантировать, что поиск, выполняемый isgood_memory
, будет достаточно быстрым. Хэш-таблица поддерживает значения указателя (элементы типа void *
), чтобы сделать возможным поиск. Понятно, что значения добавляются и удаляются из хеш-таблицы, чтобы поддерживать ее в актуальном состоянии с тем, что было выделено и что было освобождено, соответственно.
Переносимость библиотеки меня больше всего беспокоит. Он был разработан для использования только в среде, в основном совместимой с C90 (ISO/IEC 9899:1990)... не более того.
Вопрос
Поскольку меня больше всего беспокоит переносимость, я не мог предположить, что sizeof(void *) == sizeof(X)
для хеш-функции. Поэтому я прибегал к побайтовой обработке значения, как если бы это была строка. Для этого хэш-функция выглядит примерно так:
static size_t hashit(void *ptrval)
{
size_t i = 0, h = 0;
union {
void *ptrval;
unsigned char string[sizeof(void *)];
} ptrstr;
ptrstr.ptrval = ptrval;
for (; i < sizeof(void *); ++i) {
size_t byte = ptrstr.string[i];
/* Crazy operations here... */
}
return (h);
}
Какие проблемы переносимости у кого-либо из вас есть с этим конкретным фрагментом? Буду ли я сталкиваться с какими-либо странными проблемами выравнивания при доступе к ptrval
байт за байтом?