gpt4 book ai didi

c++ - 在指针中编码其他信息

转载 作者:行者123 更新时间:2023-12-02 10:02:20 27 4
gpt4 key购买 nike

我的问题:

我需要在指向对象的指针中编码有关该对象的其他信息。
我以为我可以做的是使用指针的一部分来做。也就是说,使用一些位对 bool(boolean) 标志进行编码。据我所知,Windows内核中的某些类型的句柄可以完成相同的操作。

背景:

我正在写一个小型的内存管理系统,可以垃圾收集未使用的对象。为了减少对象引用的内存消耗并加快复制速度,我想将指针与其他编码数据一起使用,例如对象的状态( Activity 或准备好收集),锁定位以及可以用单个位表示的类似内容。

我的问题:

如何在不实际覆盖指针的重要位的情况下将此类信息编码为64位指针?

由于x64窗口的地址空间有限,我相信并不是所有64位指针都被使用,因此我相信应该是可能的。但是,我无法找到Windows实际用于指针的哪些位,以及哪些不用于指针的位。为了澄清,此问题与64位Windows上的用户模式有关。

提前致谢。

最佳答案

这在很大程度上取决于所使用的体系结构,操作系统和编译器,但是如果您知道这些事情,则可以使用它来做一些事情。

x86_64在硬件中定义了一个面向48位1字节的虚拟地址空间,这意味着基本上所有的OS和编译器都将使用该地址空间。这意味着:

  • 所有有效地址的前17位必须全部相同(全0或全1)
  • 任何2k字节对齐地址的后k位必须全为0
  • 此外,几乎所有操作系统(至少Windows,Linux和OSX)都保留将高位设置为内核地址的地址-所有用户地址的高17位必须全部为0s

  • 因此,这为您提供了多种方法,可将有效指针打包为少于64位,然后再使用shift和/或mask指令重建原始指针。

    如果只需要3位,并且始终使用8字节对齐的指针,则可以使用后3位对额外的信息进行编码,并在使用指针之前将其屏蔽。

    如果需要更多位,可以将指针向上(向左)移动16位,并使用低16位作为信息。要重建指针,只需右移16。

    要对指针进行移位和屏蔽操作,您需要将它们强制转换为 intptr_tint64_t(在C或C++的任何64位实现上,它们的类型都相同)

    1有一些提示,可能很快就会有硬件将其扩展到56位,因此仅前9位需要为0或1,但是要等待任何操作系统支持,这还需要一段时间。

    关于c++ - 在指针中编码其他信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62008371/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com