10

在 The Art of Multiprocessor Programming, p215 中,作者说在 C 语言中,您可以从指针中“窃取”一点,并使用按位运算符从单个单词中提取一些标志(标记)和指针。我不知道这是怎么做到的,所以举个例子对我有帮助。

4

2 回答 2

12
  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;
    }
    
于 2013-10-15T19:25:35.063 回答
10

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

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

于 2013-10-15T19:20:51.903 回答