【发布时间】:2021-02-08 12:53:59
【问题描述】:
我想知道是否允许 C++ 实现以不同的方式表示指向不同类型的指针。例如,如果我们有 4 字节大小/对齐的int 和 8 字节大小/对齐的long,是否可以将指向int/long 的指针表示为对象地址右移 2 /3 位,分别?这将有效地禁止将指向long 的指针转换为指向int 的指针。
我问是因为[expr.reinterpret.cast/7]:
对象指针可以显式转换为不同类型的对象指针。 当对象指针类型的prvalue
v转换为对象指针类型“pointer to cvT”,结果是static_cast<cv T*>(static_cast<cv void*>(v))。[注 7:将指向
T1类型对象的“指向T1”类型的指针转换为“指向T2”类型的指针(其中@987654335 @ 是一个对象类型并且T2的对齐要求并不比T1更严格)并且回到它的原始类型会产生原始指针值。 — 尾注]
第一句话表明我们可以将指针转换为任意两种对象类型。然而,(非规范性的)注 7 中的移情文本表示对齐在这里也起到了一定的作用。 (这就是为什么我想出了上面那个int-long 的例子。)
【问题讨论】:
-
@JHBonarius 但是是什么迫使 C++ 实现使用相同的表示?在我的示例中,实现将指向
int的指针表示为右移两位的地址(您的“机器内存模型指针”)。如果它在指针被传递到某些与内存相关的机器代码指令之前将其移回,则不会有技术问题。 (当然,没有理智的实施可能会这样做,但这是关于这种可能性的语言律师问题。) -
如果我们有 4 字节大小/对齐的 int 和 8 字节大小/对齐的 long,是否可以将指针指向 int/long 表示为对象地址右移 2 /3 位,分别?这将有效地禁止将指针到长指针转换为指针到int你能解释一下吗?
-
指向不同类型的指针可以有不同的二进制表示吗?“不同”是什么意思(即如何观察)? like this?
-
@LanguageLawyer 解释什么?你有什么特别不明白的地方?
-
@LanguageLawyer 至于你的第二个问题,基本上是的。但是我没有写任何关于观察的东西。我关心指针到不同类型的转换。 (例如,你能不能总是将一个指向
T1的指针转换为指向T2的指针,然后再返回并确保它有效?看来这取决于T1和T2的对齐要求。)
标签: c++ pointers language-lawyer bit-representation