我需要一种将指针标记为集合x或集合y的一部分的方法(即:标记只有2个“状态”),我的意思是可以假定untagged = x和agged = y。
目前,我正在考虑使用按位异或执行此操作:
ptr ^ magic = encoded_ptr
encoded_ptr ^ magic = ptr
但是我很困惑如何首先确定指针是否被标记。
我正在使用它来标记链接列表中的池节点来自何处,以便在取消链接时,它们可以返回到正确的perant。
更新
只是为了使所有建议将标志存储在额外的数据成员中的人清楚知道,我仅限于
sizeof(void*)
,所以我不能添加新成员,否则我会添加。而且这些池不是连续的,它们由许多页面组成,跟踪范围会增加过多的开销(我追求一种快速简单的解决方案,如果可以的话)。 最佳答案
大多数解决方案将针对特定平台。这里有一些:
1)由malloc
或new
返回的指针将对齐(4、8、16、32字节,您可以命名)。因此,在大多数体系结构上,地址的几个LSB位将始终为0。
2)和Win32特定的方式:除非您的程序使用3GB开关,否则所有用户模式指针的值都小于0x80000000,因此可以将最高位用作标志。作为奖励,当取消取消对标记的指针的引用而不进行修复时,它也将崩溃。
关于c++ - 标记/编码指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4586002/