【发布时间】:2009-06-12 22:37:50
【问题描述】:
目的
我正在为一个更大的项目编写一个小库,它提供 malloc/realloc/free 包装函数以及一个可以告诉您其参数(void * 类型)是否对应于 live(尚未已释放)由库的包装函数分配和管理的内存。让我们将此函数称为isgood_memory。
在内部,库维护一个哈希表以确保isgood_memory 执行的搜索相当快。哈希表维护指针 values(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 会遇到任何奇怪的对齐问题吗?
【问题讨论】:
-
字节序可能是个问题
-
不是真的;它仅用于程序内的散列,因此字节序是固定的,应用哪种字节序无关紧要。
-
我刚刚将它从一个小端平台移植到一个大端平台(我可以访问的 Sun Microsystems 服务器)。一切似乎都运行良好。
-
Endianness 几乎肯定会改变为 same 指针值计算的哈希值,但是因为您不会在任何指针上都有 same 指针值其他平台(一般来说)这应该不是问题。如果是,那么您遇到了不同的问题。
标签: c pointers hash alignment portability