gpt4 book ai didi

c++ - 指向不同类型的指针可以有不同的二进制表示吗?

转载 作者:行者123 更新时间:2023-12-03 10:04:19 26 4
gpt4 key购买 nike

我想知道是否允许 C++ 实现以不同方式表示指向不同类型的指针。例如,如果我们有 4 字节大小/对齐的 int和 8 字节大小/对齐 long , 是否可以表示指向- int 的指针/long作为对象地址分别右移 2/3 位?这将有效地禁止将指针转换为-long变成指向- int的指针.
我问是因为 [expr.reinterpret.cast/7] :

An object pointer can be explicitly converted to an object pointer of a different type. When a prvalue v of object pointer type is converted to the object pointer type “pointer to cv T”, the result is static_­cast<cv T*>(static_­cast<cv void*>(v)).

[Note 7: Converting a pointer of type “pointer to T1” that points to an object of type T1 to the type “pointer to T2” (where T2 is an object type and the alignment requirements of T2 are no stricter than those of T1) and back to its original type yields the original pointer value. — end note]


第一句暗示我们可以将指针转换为任意两种对象类型。但是,(非规范性)注释 7 中的移情文本表示对齐在这里也起到了一定的作用。 (这就是为什么我想出了上面的 int - long 示例。)

最佳答案

是的
作为一个具体的例子,有一个 C++ 实现,其中指向单字节元素的指针大于指向多字节元素的指针,因为硬件使用字(而不是字节)寻址。为了模拟字节指针,C++ 使用硬件指针加上额外的字节偏移量。void*存储额外的偏移量,但 int*才不是。转换 int*char*工作(因为它必须在标准下),但是 char*int*失去该偏移量(您的注释隐含地允许)。
The Cray T90 supercomputer是此类硬件的一个示例。
我会看看我是否能找到标准论点,为什么这对于兼容的 C++ 编译器来说是有效的;我只知道有人这样做了,并不是说这样做是合法的,而是该注释暗示它是合法的。
规则将在 to-from void 指针转换规则中。您引用的段落隐含地将转换的含义转发到那里。
7.6.1.9 静态转换 [expr.static.cast]

A prvalue of type “pointer to cv1 void” can be converted to a prvalue of type “pointer to cv2 T”, where T is an object type and cv2 is the same cv-qualification as, or greater cv-qualification than, cv1.If the original pointer value represents the address A of a byte in memory and A does not satisfy the alignment requirement of T, then the resulting pointer value is unspecified.Otherwise, if the original pointer value points to an object a, and there is an object b of type T (ignoring cv-qualification) that is pointer-interconvertible with a, the result is a pointer to b.Otherwise, the pointer value is unchanged by the conversion.


这表明转换为更对齐的类型会生成一个未指定的指针,但转换为实际上不存在的相等或更少对齐的类型不会改变指针值。
这是允许将指向 4 字节对齐数据的指针转换为指向 8 字节对齐数据的指针导致垃圾。
每个对象无关的指针转换都需要通过 void* 在逻辑上往返。然而。

An object pointer can be explicitly converted to an object pointer of a different type. When a prvalue v of object pointer type is converted to the object pointer type “pointer to cv T”, the result is static_­cast<cv T*>(static_­cast<cv void*>(v)).


(来自 OP)
涵盖 void*T* ;我还没有找到 T*void*转换文本以使其完整 水平回答。

关于c++ - 指向不同类型的指针可以有不同的二进制表示吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66102053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com