在指针

时间:2016-12-13 21:40:47

标签: c++ pointers casting unsigned-integer

我正在构建一个八叉树数据结构,为了节省最终节点的内存,我希望将值直接存储在指针中,而不是必须创建一个容纳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

这怎么可能?

2 个答案:

答案 0 :(得分:5)

不允许以便携式方式在指针中直接存储无符号整数,但您可以:

  • 反过来:你可以将指针存储在无符号整数中;具体而言,标准明确保证uintptr_t足以让指针在往返中幸存;
  • 使用union

    union NodePtr {
        Octree *child;
        uint32_t value;
    }
    

    此处childvalue共享相同的内存位置,您只能从上次写入的内容中读取内容;如果您在终端节点中,则使用value,否则请使用child

答案 1 :(得分:0)

好吧,你可以将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

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