据我所知,所有这样做的“传统”方式,即reinterpret_cast
指针和union
withint
和float
字段都是 UB,因为它违反了严格的别名(在 C++ 中,而不是在 C 中)。
那么,如何在没有未定义行为的情况下正确地做到这一点?
我可以对 uint32_t做一个reinterpret_cast
to和 memcpy 吗?char *
或者也许std::launder
会有帮助?
据我所知,所有这样做的“传统”方式,即reinterpret_cast
指针和union
withint
和float
字段都是 UB,因为它违反了严格的别名(在 C++ 中,而不是在 C 中)。
那么,如何在没有未定义行为的情况下正确地做到这一点?
我可以对 uint32_t做一个reinterpret_cast
to和 memcpy 吗?char *
或者也许std::launder
会有帮助?
正如Jason Turner所指出的,标准的做法是使用memcpy
:
float f = 1.0;
std::byte c[sizeof(f)];
memcpy(c, &f, sizeof(f));
您可能会认为您不想复制任何内容,只想查看位/字节。好吧,编译器很聪明,他们实际上会优化它,正如 Jason 所证明的那样,所以不要担心并使用memcpy
这种东西,永远不要reinterpret_cast
。