C++:在不提交未定义行为的情况下从 char 指针转换为 struct 指针

C++: Casting from char pointer to struct pointer without committing undefined behavior

struct S { char A; char B; char C; char D; };
unsigned char x[4] = { 0xDE, 0xAD, 0xBE, 0xEF };
auto y = (S*) x;
cout << y->A; // undefined behaviour

这里的第四行违反了strict aliasing,这意味着编译器可能决定对我玩一些卑鄙的把戏。有没有办法在不调用未定义行为的情况下实现类似的东西?

  • 转换和取消引用是未定义的行为。
  • 联合转换在 C 中是合法的...在 C++ 中是未定义的行为。
  • reinterpret_cast 是未定义的行为。

唯一合法的方法是 memcpy。一个足够聪明的编译器会把它优化成虚无,但你真的没有保证。