如果您定义了一个用于遍历数据结构的联合(start
和end
偏移)或通过指向树结构的指针,这取决于64位系统上的数据元素的数量联合与高速缓存行对齐,是否有可能在这64位中的一个位上添加一位标志,以便知道必须使用哪个遍历并仍然允许重构右指针?
union {
uint32_t offsets[2];
Tree<NodeData> * tree;
};
答案 0 :(得分:5)
它依赖于系统,但我认为任何64位系统都不会真正使用它的全指针长度 此外,如果您知道您的数据是2 n - 对齐,那么n位可能只是闲置在那里(在一些旧系统上它们就不存在。但我不认为这些是64位系统,无论如何他们不再感兴趣了。)
例如,x86_64使用48位,高16位必须与bit47相同。 (符号扩展)
另一个例子,ARM64使用49位(同时48位的2位映射),所以你只剩下15位。
请记住核对窃取的比特。 (您可能希望使用uintptr_t
而不是指针,并在更正后进行转换。)
使用未对齐或不可能的指针会导致从静音自动校正,无声失误行为到大声崩溃等行为。