根据http://en.cppreference.com/w/cpp/language/reinterpret_cast,已知reinterpret_cast
指向具有足够大小的积分并返回的指针产生相同的值。我想知道标准是否也符合反过来。也就是说,reinterpret_cast
是一个足够大小的指针类型的积分,并返回产生相同的值吗?
答案 0 :(得分:1)
不,标准不保证这一点。引用C ++ 14(n4140)[expr.reinterpret.cast]中涉及指针整数转换的所有部分,强调我的:
4指针可以显式转换为足以容纳它的任何整数类型。映射功能是 实现定义。 [注意:对于那些了解寻址结构的人来说,这并不奇怪 底层机器。 -end note ] ...
5可以将整数类型或枚举类型的值显式转换为指针。转换的指针 到一个足够大小的整数(如果在实现上存在任何这样的整数)并返回到相同的指针类型 将具有其原始价值; 指针和整数之间的映射是实现定义的。 [注意:除3.7.4.3中所述外,此类转换的结果不是安全派生的指针 值。 -end note ]
因此,从积分值开始并将其转换为指针并返回(假设没有大小问题)是实现定义的。这意味着您必须查阅编译器的文档,以了解此类往返是否保留了值。因此,它肯定不是便携式的。
答案 1 :(得分:0)
我在库中导出指向对象的指针作为不透明的标识符时出现了这个问题,现在尝试从外部调用恢复这些指针不适用于旧的x86 CPU(在Windows 98的时候)。因此,虽然我们可以期待这种行为,但在一般情况下这是错误的。在386-CPU中,地址由重叠指针组成,因此任何内存位置的地址都不是唯一的,我发现转换回不会恢复原始值。