在 The Art of Multiprocessor Programming, p215 中,作者说在 C 语言中,您可以从指针中“窃取”一点,并使用按位运算符从单个单词中提取一些标志(标记)和指针。我不知道这是怎么做到的,所以举个例子对我有帮助。
问问题
1923 次
2 回答
12
确保指针对象在内存中对齐,以便所有指针都是偶数。然后最后一位可以自由存储单个布尔标志。(这不能完全便携。因此您需要了解平台。)
将指针作为类型的整数移动
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 回答