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++ winsockets

c++ - 了解从多个类派生时的虚函数

java - 是否存在与 C union 或 C++ std::variant 等效的内存高效 Java?

C++ 专门针对特定类型的 lambda

c++ - gdb python编程: how to write code that will set breakpoints to every method of a C++ class?

c# - 我将创建一个程序用条形码检查库存,我需要学习什么

C++问题初始化一个对象两次

c - 列表程序中不兼容指针类型的赋值

c - 如何将指针传递给C中的指针数组

c++ - 确定 reinterpret_cast 在编译时是否安全