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 体系结构(很少见但存在),或任何无法定义字节顺序的体系结构。
根据 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 体系结构(很少见但存在),或任何无法定义字节顺序的体系结构。