1

据我所知,所有这样做的“传统”方式,即reinterpret_cast指针和unionwithintfloat字段都是 UB,因为它违反了严格的别名(在 C++ 中,而不是在 C 中)。
那么,如何在没有未定义行为的情况下正确地做到这一点?

我可以对 uint32_t做一个reinterpret_castto和 memcpy 吗?char *或者也许std::launder会有帮助?

4

1 回答 1

1

正如Jason Turner所指出的,标准的做法是使用memcpy

float f = 1.0;
std::byte c[sizeof(f)];
memcpy(c, &f, sizeof(f));

您可能会认为您不想复制任何内容,只想查看位/字节。好吧,编译器很聪明,他们实际上会优化它,正如 Jason 所证明的那样,所以不要担心并使用memcpy这种东西,永远不要reinterpret_cast

于 2019-10-13T20:08:46.043 回答