我需要一种将指针标记为集合x或集合y的一部分的方法(即:标记只有2个“状态”),我的意思是可以假定untagged = x和agged = y。

目前,我正在考虑使用按位异或执行此操作:

ptr ^ magic = encoded_ptr
encoded_ptr ^ magic = ptr

但是我很困惑如何首先确定指针是否被标记。
我正在使用它来标记链接列表中的池节点来自何处,以便在取消链接时,它们可以返回到正确的perant。

更新

只是为了使所有建议将标志存储在额外的数据成员中的人清楚知道,我仅限于sizeof(void*),所以我不能添加新成员,否则我会添加。而且这些池不是连续的,它们由许多页面组成,跟踪范围会增加过多的开销(我追求一种快速简单的解决方案,如果可以的话)。

最佳答案

大多数解决方案将针对特定平台。这里有一些:

1)由mallocnew返回的指针将对齐(4、8、16、32字节,您可以命名)。因此,在大多数体系结构上,地址的几个LSB位将始终为0。

2)和Win32特定的方式:除非您的程序使用3GB开关,否则所有用户模式指针的值都小于0x80000000,因此可以将最高位用作标志。作为奖励,当取消取消对标记的指针的引用而不进行修复时,它也将崩溃。

关于c++ - 标记/编码指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4586002/

10-11 22:33
查看更多