gpt4 book ai didi

c++ - reinterpret_cast 什么时候修改位?

转载 作者:可可西里 更新时间:2023-11-01 16:11:20 26 4
gpt4 key购买 nike

来自 C++ 标准:

5.2.10.3

The mapping performed by reinterpret_cast might, or might not, produce a representation different from the original value.

我在这个网站接受过培训,相信并重复这一点。 (即使可能只是琐事)。从 float*int*reinterpret_cast 被允许产生不同的位模式。唯一的保证是 reinterpret_cast 将结果返回到 float* 将产生原始位模式。

我的问题:这会发生吗?是否存在实际 reinterpret_cast 为不同位模式的现有真实平台或 CPU 或编译器?如果不是,是否存在任何 reinterpret_cast 具有任何运行时开销的真实情况?

根据我所有使用 reinterpret_cast 的经验,转换是针对编译器的指令,而不是运行时

最佳答案

指针原则上可以有不同的大小。最大的指针,如果有任何区别(忽略成员指针,谈论真正的指针),是 char* , 因为 char根据定义是一个字节,可以在任何地方,不需要对齐。 void*必须能够表示 char* .

在带有 int* 的系统上使用比 char* 更少的位,朝那个方向重新解释转换可能有点冒险。

我认为通过这些指针(嘿)您可以在标准中找到它。是关于void*的要求对于任何指针都足够大,以及关于对齐的事情:越严格/越大,指向该类型的指针所需的位数越少。但我从未听说过任何现存的系统存在这种差异。


关于 void* 的标准语能够代表char* :

C++11 §3.9.2/4:


A pointer to cv-qualified (3.9.3) or cv-unqualified void can be used to point to objects of unknown type. Such a pointer shall be able to hold any object pointer. An object of type cv void* shall have the same representation and alignment requirements as cv char*

“任何对象指针”含糊地暗示有不同大小的指针。


关于所指对象对齐的标准语:

C++11 §5.2.10/7:


An object pointer can be explicitly converted to an object pointer of a different type. When a prvalue v of type “pointer to T1” is converted to the type “pointer to cv T2”, the result is static_cast<cv T2*>(static_cast<cv void*>(v)) if both T1 and T2 are standard-layout types (3.9) and the alignment requirements of T2 are no stricter than those of T1, or if either type is void. Converting a prvalue of type “pointer to T1” to the type “pointer to T2” (where T1 and T2 are object types and where the alignment requirements of T2 are no stricter than those of T1) and back to its original type yields the original pointer value. The result of any other such pointer conversion is unspecified.

值得注意的是,稍后在标准中有一些对类派生的 C 风格模拟的支持,这显然与上面末尾的“任何其他”相矛盾:

C++11 §9.2/20,


A pointer to a standard-layout struct object, suitably converted using a reinterpret_cast, points to its initial member (or if that member is a bit-field, then to the unit in which it resides) and vice versa.

在这种情况下,两个对象必然具有相同的对齐方式,而前面引用的段落只讨论了类型的对齐方式——但显然形式上的小矛盾不是实际问题,正如我所看到的.

关于c++ - reinterpret_cast 什么时候修改位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24646084/

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