できうる限り規格上認められたコードを書くように努力するべきだよ
処理系依存にならざるを得ない部分も有ると思うが
可能な限り減らす努力をするというのは言うまでもないだろう
未定義動作が含まれたコードは非常に不味く
コンパイラはとんでもない最適化をかけてくることがあるからね
unionの件でいえば、アクディブでないメンバの読出しは未定義動作なので
意味のないコードとして一切をバッサリ削除するっていう最適化も
規格上は許されていると思う
未定義動作に関してはコンパイラは何をしても許されることになっているからね

有名なのでは
before(p);
auto i = *p;
after(p);
このコードで、beforeとafterがインライン展開されたとき
beforeやafterでpのnullチェックをしていたとしても
そのチェックをコンパイラは削除しにかかるかもしれない
なぜならauto i = *p;があるのでpは絶対にnullではないという判断
この効能は、デリファレンスの前のコードにも及ぶ、つまりbeforeも最適化の対象
pがnullの時、auto i = *p;は未定義動作になるので
pがnullの場合においてはコンパイラは何をしても自由ってことで
バッサリ削除しにかかるわけだわ、おっそろし
例えばbeforeの中で、if(!p){ output_log(); abort(1); }としていて
プログラマはそのことを知っていたので、auto i = *p;の時にはnullチェックをしなかった
のかもしれないが、一切のコードは削除されて、ログも吐かずにセグフォで落ちるということもありうる

未定義動作というのは最適化において直感的にはわからない非常にまずいことが起こる場合があるので
避けたほうがよいだろう