目的
我正在为一个较大的项目编写一个小型库,它提供 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
通过逐字节访问,我会遇到任何奇怪的对齐问题吗?