reinterpret_cast 转换链正确性

reinterpret_cast conversion chain correctness

根据 type aliasing rules,我假设:

1) uint64_t*uint32_t* 的直接转换 - 不正确 (我无法通过结果指针访问数据。请确定我会得到正确的值)

2) 转换链 OK(我可以安全地访问数据)

uint64_t* -> unsigned char* -> uint32_t*

uint64_t* -> void* -> uint32_t*

我对规则的理解是否正确?

我总是更喜欢使用 unions,以防止任何可能的 ptr。转换问题(可能导致数据损坏),但并不总是可行(且好的)解决方案。

2) conversion chains is OK (i can safely access the data)

uint64_t* -> unsigned char* -> uint32_t*

uint64_t* -> void* -> uint32_t*

Am i understanding the rules correctly or not?

没有。像这样的链式 reinterpret_cast 不会比直接 reinterpret_cast.

更正确

I'm always prefer to use unions instead

使用并集进行类型双关也违反了别名规则。


如果你有一个指向 uint64_t 的指针,并且你想使用对象中包含的八个字节中的四个(我假设是一个 8 位字节)并将它们解释为 uint32_t,那么您必须首先决定要使用八个字节中的哪一个。毕竟,所有 8 个都装不下一个 uint32_t。您想要低位字节还是高位字节?或者更奇特的东西,就像其他字节一样?还要考虑字节在结果 uint32_t.

中的顺序。

如果您需要基于重要性的特定字节,那么可移植的方法是使用位移和掩码。

如果你想要基于它们在内存中的位置的特定字节,那么可移植的方法是使用 std::memcpy.

如果您确定您的机器是大端还是小端(几乎总是如此),您可以使用 htonl() 来检测字节顺序。在这两种架构上,uint64_t 可以被视为 uint32_t[2],只是字节顺序不同。因此,您可能 reinterpret_cast 并根据字节顺序添加偏移量。虽然这是非标准的,但只有一种可能的大端和小端(pigeonhole 原则)实现。请注意,这不适用于例如middle-endian 体系结构(很少见但存在),或任何无法定义字节顺序的体系结构。