Назначение
Я пишу небольшую библиотеку для большого проекта, которая предоставляет функции-оболочки 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
побайтно?