我正在构建一个八叉树数据结构,为了节省最终节点的内存,我希望将值直接存储在指针中,而不是必须创建一个容纳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
这怎么可能?
答案 0 :(得分:5)
不允许以便携式方式在指针中直接存储无符号整数,但您可以:
uintptr_t
足以让指针在往返中幸存; 使用union
:
union NodePtr {
Octree *child;
uint32_t value;
}
此处child
和value
共享相同的内存位置,您只能从上次写入的内容中读取内容;如果您在终端节点中,则使用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
但是如果你这样做,我看不出你是如何检测到给定的八叉树*实际存储数据而不是指向另一个八叉树的指针