c++ - 如果整数与指针的大小相同,是否将整数重新解释为指针双射?

标签 c++ pointers reinterpret-cast

给定一个整数类型 IntT这样 sizeof(IntT) == sizeof(void*) ,以及所述类型的变量 i , 是否保证reinterpret_cast<IntT>(reinterpret_cast<void*>(i)) == i ?这类似于 this question ,但这个问题是在寻找任意大小的整数,所以答案是直接否定。将其限制为与指针大小完全相同的整数会使其更有趣。

我觉得答案似乎必须是"is",因为规范指出存在到任何大到足以容纳指针值的整数的映射。如果变量大小相同,则该映射必须是双射的。如果它是双射的,那么这也意味着从 int 的转换至 void*也必须是双射的。

但是这个逻辑有漏洞吗?规范中是否有我没有考虑到的摇摆不定的词?

最佳答案

我不认为这是有保证的。该标准保证指针转换为适当大的整数并返回时将具有其原始值。由此可知,存在从指针到适当大整数的子集并返回的映射。它并不意味着对于每个适当大的整数值,都有一个对应的指针值……

正如 DavisHerring 在下面的评论中所指出的,这意味着映射是单射的,但不一定是满射的,因此是双射的。我相信该标准在数学术语中暗示的是指针和整数之间存在左唯一和左总关系,而不是双射函数。

想象一下一些奇怪的架构,由于某种原因,地址的每三个位必须为零。或者稍微更合理的架构,仅使用 64 位值的低 42 位来存储地址。不管这有多大意义,编译器可以自由地假设一个整数值被转换为一个指针必须遵循有效地址的模式,例如,屏蔽掉每三个位或只使用较低的六个字节分别……

关于c++ - 如果整数与指针的大小相同,是否将整数重新解释为指针双射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52770134/

相关文章:

c++ - 无法使用与时间和时钟相关的函数 C++ 进行编译

c++ - 将 std::vector 传递给 openCL 内核 C++ 绑定(bind)

指向具有特定参数的函数的指针的c++ vector

c - 如何 free() 一个结构正确的 malloc()?

c - 为学生 ID 和分数生成正确的输出并找到最大值和最小值?

c++ - 了解神秘的C++语句

C++。从 double 重新解释为 unsigned char*

c++ - 任何人都可以解释重新解释转换如何在此代码中工作

c++ - c++中从其他项目的main方法调用main方法

c++ - -fno-omit-frame-pointer 没有优化