标记/编码指针

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)返回mallocnew将对齐的指针(4,8,16,32字节,您可以命名).因此,在大多数架构中,地址的几个LSB位始终为0.

2)以Win32为特定方式:除非你的程序使用3GB开关,否则所有用户模式指针的值都小于0x80000000,因此最高位可以用作标志.作为奖励,当标记指针被解除引用而未被修复时,它也会崩溃.

  • 我完全忘记了对齐,所以完全解决了我的问题,因为我可以保证所有的指针都要对齐至少4 :) (4认同)

Vin*_*Pai 8

没有安全和便携的方式来使这种事情发挥作用.您可能能够找到一些特定于系统的位,这些位始终是已知值(例如,最重要的n位),但这是一个非常脆弱且危险的依赖.您无法判断指针是否"已标记",除非指针中的某些位首先具有已知值.

更好的方法是在指针指向的结构中存储标识符.