On 12/09/14 00:25, haynberg@xxxxxxxxx wrote: >>> msg *p = reinterpret_cast<msg*>(get_bytes()); >> >> Why are you doing this? > > For efficiency, by preventing a copy (imagine get_bytes() is getting > bytes out of a socket buffer). Firstly, char types alias everything. Secondly, even if you call memcpy(), a compiler doesn't have to do any copies if it can prove that the union you're reading into doesn't escape. Look at this: double kludge(void *p) { union { char bytes[sizeof (double)]; double d; } u; memcpy(u.bytes, p, sizeof u.bytes); return u.d; } which generates kludge: ldr d0, [x0] ret and is completely portable, with no undefined behaviour. > Putting alignment/padding concerns aside, it would be nice if there > was a way to explicitly tell the compiler, I want to do this and, > please don’t reorder stores and loads, or perform other > strict-aliasing optimizations, on the memory pointed to by this > pointer (similar to the effect of a memcpy). I believe the only way > to do this is with the GCC may_alias attribute, or a more > heavy-handed memory clobber. I think the OP wanted to ask the GCC > folks if there was another, possibly more portable, way; for > example, placement new, but that turned out not to be an option. Well, there isn't a more portable way, and we can't ignore alignment. All that GCC can do is provide a way to do it; we can't make anyone else comply. > Another related, maybe more important, question is if GCC sees a > reinterpet_cast like this (without a may_alias type), is it free to > discard code or otherwise drastically change it due to the fact that > it’s undefined by the standard? Yes. It may, and it does. Andrew.