C ++:从char指针转换为struct指针而不提交未定义的行为

时间:2016-10-13 01:42:59

标签: c++ strict-aliasing

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,这意味着编译器可能决定对我发挥一些卑鄙的技巧。有没有办法在不调用未定义的行为的情况下实现类似的东西?

1 个答案:

答案 0 :(得分:1)

  • 投射和解除引用是未定义的行为。
  • 联盟演员是犹太人......在C ++中它是未定义的行为。
  • reinterpret_cast是未定义的行为。

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