在多处理器编程的艺术中,p215,作者说在C中,你可以从指针“偷”一点,并使用逐位运算符从单个字中提取一些标志(一个标记)和指针。我不知道这是怎么做的,所以一个例子可以帮助我。
答案 0 :(得分:8)
想象一下具有32位指针大小的系统,但只有1GB的内存可用。您只需要30位来寻址整个存储空间,因此高2位未使用。您可以将这两个高位用于您自己的目的 - 例如,按指针类型标记指针(堆栈/全局与动态)。
请注意,您获得的代码与获取的代码一样不可移植。您需要非常熟悉运行代码的CPU - 具体而言,当指针中的地址发送到地址总线时,您需要知道高位是否会被丢弃。
答案 1 :(得分:8)
确保指针对象在内存中对齐,以便所有指针都是偶数。然后最后一位可用于存储单个布尔标志。 (这不能完全移植。所以你需要了解平台。)
将指针作为uintptr_t
类型的整数移动。这些很容易被操纵:
bool get_flag(uintptr_t p)
{
return p & 1;
}
void *get_pointer(uintptr_t p)
{
return (void *)(p & (UINTPTR_MAX ^ 1));
}
uintptr_t set_flag(uintptr_t p, bool value)
{
return (p & (UINTPTR_MAX ^ 1)) | value;
}