从指针窃取位

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

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

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

  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; }