从指针窃取位

时间:2013-10-15 19:16:40

标签: c pointers bit-manipulation

在多处理器编程的艺术中,p215,作者说在C中,你可以从指针“偷”一点,并使用逐位运算符从单个字中提取一些标志(一个标记)和指针。我不知道这是怎么做的,所以一个例子可以帮助我。

2 个答案:

答案 0 :(得分:8)

想象一下具有32位指针大小的系统,但只有1GB的内存可用。您只需要30位来寻址整个存储空间,因此高2位未使用。您可以将这两个高位用于您自己的目的 - 例如,按指针类型标记指针(堆栈/全局与动态)。

请注意,您获得的代码与获取的代码一样不可移植。您需要非常熟悉运行代码的CPU - 具体而言,当指针中的地址发送到地址总线时,您需要知道高位是否会被丢弃。

答案 1 :(得分:8)

  1. 确保指针对象在内存中对齐,以便所有指针都是偶数。然后最后一位可用于存储单个布尔标志。 (这不能完全移植。所以你需要了解平台。)

  2. 将指针作为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;
    }