Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在64位指针中添加1位标志_C++ - Fatal编程技术网

C++ 在64位指针中添加1位标志

C++ 在64位指针中添加1位标志,c++,C++,如果定义了一个并集,用于按顺序(start和end偏移量)或通过指向树结构的指针(取决于64位系统上的数据元素数量,其中这些并集与缓存线对齐)遍历数据结构,是否有可能在这64位中的一位添加一位标志,以便知道必须使用哪个遍历,并且仍然允许重建正确的指针 union { uint32_t offsets[2]; Tree<NodeData> * tree; }; 联合{ uint32_t偏移量[2]; 树*树; }; 它依赖于系统,但我认为还没有任何64位系统真正使用它

如果定义了一个并集,用于按顺序(
start
end
偏移量)或通过指向树结构的指针(取决于64位系统上的数据元素数量,其中这些并集与缓存线对齐)遍历数据结构,是否有可能在这64位中的一位添加一位标志,以便知道必须使用哪个遍历,并且仍然允许重建正确的指针

union {
    uint32_t offsets[2];
    Tree<NodeData> * tree;
};
联合{
uint32_t偏移量[2];
树*树;
};

它依赖于系统,但我认为还没有任何64位系统真正使用它的完整指针长度。
另外,如果你知道你的数据是2n对齐的,那么这些n位很可能只是闲置在那里(在一些旧系统上,它们根本不存在。但我认为这些都不是64位系统,而且不管怎样,它们已经不受关注了)

例如,x86_64使用48位,高位16必须与位47相同。(符号扩展)
另一个例子是,ARM64使用49位(同时有两个48位的映射),因此只剩下15位

记住要把偷来的东西改正过来。(您可能希望使用
uintptr\t
而不是指针,并在更正后进行转换。)


使用错误对齐或不可能对齐的指针会导致从静默自动更正、过静默错误行为到大声崩溃的行为。

您可以使用指针的最低有效位(很可能,您永远不会得到奇数指针,因为
new
返回的地址对齐为2、4或8)。这项工作的“支付”是存储
偏移量,因此左移一位不会有任何伤害?最低有效位是另一种选择:我从未见过
new
会返回奇数指针的系统。不要移动有价值的位,只要找到可能使用的位即可。或者,如果你使用<代码> UntPrTrtt(当然是首选),MungEngor,不管你想要什么,只在转换之前恢复它们。实际上,它是纯编译时间构造:没有生成指令。实现这一点的一种方法是使用C++类,用公共方法返回<<代码> uTutpRtTu< /Cuff>和<代码>布尔O/COD>。然后,可以用这些方法巧妙地封装去模糊不清的内容,并可能导致更少的潜在错误。