在指针中存储无符号整数

Storing unsigned integer in a pointer

我正在构建一个八叉树数据结构,为了为最终节点节省内存,我希望将值直接存储在指针中,而不必创建一个可以容纳 8 个子节点的对象。

我的数据类型是 uint32_t,这意味着指针有足够的位来将其保存在 x86 或 amd64 上。

那么如何在 x86 或 amd64 指针中存储无符号 32 位整数?

伪代码:

uint32_t i = 123;
Octree* ptr = i;
uint32_t ii = ptr;
std::cout << ii << std::endl; //Prints 123

这怎么可能?

直接将无符号整数 存储在 指针中是不允许的,但您可以:

  • 反之亦然:您可以将指针存储在无符号整数中;具体来说,标准明确保证 uintptr_t 足够大,可以让指针在往返过程中存活下来;
  • 使用 union:

    union NodePtr {
        Octree *child;
        uint32_t value;
    }
    

    这里 childvalue 共享同一个内存位置,你只能从上次写入的那个地方读取;当您在终端节点中时,您使用 value,否则使用 child.

好吧,您可以将 int 存储为带有强制转换的指针:

uint32_t i = 123;
Octree* ptr = reinterpret_cast<Octree*>(i);
uint32_t ii = reinterpret_cast<uint32_t>(ptr);
std::cout << ii << std::endl; //Prints 123

但是如果你这样做,我看不出你是如何检测到一个给定的八叉树*实际存储数据而不是指向另一个八叉树的指针