在指针中存储无符号整数
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;
}
这里 child
和 value
共享同一个内存位置,你只能从上次写入的那个地方读取;当您在终端节点中时,您使用 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
但是如果你这样做,我看不出你是如何检测到一个给定的八叉树*实际存储数据而不是指向另一个八叉树的指针
我正在构建一个八叉树数据结构,为了为最终节点节省内存,我希望将值直接存储在指针中,而不必创建一个可以容纳 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; }
这里
child
和value
共享同一个内存位置,你只能从上次写入的那个地方读取;当您在终端节点中时,您使用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
但是如果你这样做,我看不出你是如何检测到一个给定的八叉树*实际存储数据而不是指向另一个八叉树的指针