Nec*_*lis 4 c c++ bit-manipulation
我需要一种方法将指针标记为集合x的一部分或集合y的一部分(即:标记只有2个'状态'),我就是这意味着可以假设未标记= x和标记= y.
目前我正在寻找使用bitwise xor来做到这一点:
ptr ^ magic = encoded_ptr
encoded_ptr ^ magic = ptr
Run Code Online (Sandbox Code Playgroud)
但我很难知道如何确定指针是否在第一时间被标记.我用它来标记链表中的哪些池节点来自哪里,这样当它们脱链时,它们可以回到正确的perants.
更新
只是为了向所有那些建议将标志存储在额外数据成员中的人说清楚,我只限于sizeof(void*),所以我不能添加新成员,否则我会有.这些池也不是连续的,它们由许多页面组成,跟踪范围会增加太多的开销(我是在快速简单的解决方案之后,如果有人可以称之为).
rus*_*lik 15
大多数解决方案都是特定于平台 这里有一些:
1)返回malloc或new将对齐的指针(4,8,16,32字节,您可以命名).因此,在大多数架构中,地址的几个LSB位始终为0.
2)以Win32为特定方式:除非你的程序使用3GB开关,否则所有用户模式指针的值都小于0x80000000,因此最高位可以用作标志.作为奖励,当标记指针被解除引用而未被修复时,它也会崩溃.
没有安全和便携的方式来使这种事情发挥作用.您可能能够找到一些特定于系统的位,这些位始终是已知值(例如,最重要的n位),但这是一个非常脆弱且危险的依赖.您无法判断指针是否"已标记",除非指针中的某些位首先具有已知值.
更好的方法是在指针指向的结构中存储标识符.