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

时间:2018-10-11 23:21:39

标签: c++ pointers reinterpret-cast

给出一个整数类型IntT使得sizeof(IntT) == sizeof(void*)和一个所说类型i的变量能保证reinterpret_cast<IntT>(reinterpret_cast<void*>(i)) == i吗?这类似于this question,但该问题正在查看任意大小的整数,因此答案是直接的。将其限制为与指针大小完全相同的整数会使它更有趣。

令我惊讶的是,答案必须是“是”,因为规范指出存在到任何足以容纳指针值的整数的映射。如果变量大小相同,则该映射必须是双射的。如果是双射的,那么这也意味着从intvoid*的转换也必须是双射的。

但是这种逻辑上有漏洞吗?规范中是否有我不解释的摆动词?

1 个答案:

答案 0 :(得分:3)

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

正如戴维斯·赫林(DavisHerring)在下面的评论中指出的,这意味着映射是内射的,但不一定是外射的,因此不是双射的。我相信该标准从数学角度暗示的是,指针和整数之间存在左唯一性和左总关系,而不是双射函数。

想象一下一个奇怪的体系结构,由于某种原因,地址的每三位必须为零。或者是一种更合理的体系结构,它仅使用64位值的低42位来存储地址。不管产生多大的意义,编译器都可以自由地假定强制转换为指针的整数值必须遵循有效地址的模式,例如,每三位掩码一次或仅使用低六字节分别...