reinterpret_casting 指针类型的积分和返回是否产生相同的值?

Does reinterpret_casting an integral to a pointer type and back yield the same value?

根据http://en.cppreference.com/w/cpp/language/reinterpret_cast,已知reinterpret_cast一个指向足够大的整数的指针和返回产生相同的值。我想知道反过来是否也符合标准。也就是说,reinterpret_cast 一个足够大小的指针类型的整数和返回是否产生相同的值?

我在将指向对象的指针导出为不透明标识符的库中遇到了这个问题,现在尝试从外部调用中恢复这些指针对旧的 x86 CPU 不起作用(在 windows 98).因此,虽然我们可以预料到这种行为,但在一般情况下这是错误的。在 386-CPU 中,地址是由重叠的指针组成的,所以任何内存位置的地址都不是唯一的,我发现转换回来并不能恢复原始值。

不,标准不保证这一点。引用 C++14 (n4140) [expr.reinterpret.cast] 中涉及指针-整数转换的所有部分,强调我的:

4 A pointer can be explicitly converted to any integral type large enough to hold it. The mapping function is implementation-defined. [ Note: It is intended to be unsurprising to those who know the addressing structure of the underlying machine. —end note ] ...

5 A value of integral type or enumeration type can be explicitly converted to a pointer. A pointer converted to an integer of sufficient size (if any such exists on the implementation) and back to the same pointer type will have its original value; mappings between pointers and integers are otherwise implementation-defined. [ Note: Except as described in 3.7.4.3, the result of such a conversion will not be a safely-derived pointer value. —end note ]

因此,从一个整数值开始并将其转换为指针并返回(假设没有大小问题)是实现定义的。这意味着您必须查阅编译器的文档以了解此类往返是否保留值。因此,它肯定是不可移植的。