C++相談室 part128 [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0622デフォルトの名無しさん
2016/12/16(金) 14:04:50.98ID:vWCWSv0y処理系依存にならざるを得ない部分も有ると思うが
可能な限り減らす努力をするというのは言うまでもないだろう
未定義動作が含まれたコードは非常に不味く
コンパイラはとんでもない最適化をかけてくることがあるからね
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チェックをしなかった
のかもしれないが、一切のコードは削除されて、ログも吐かずにセグフォで落ちるということもありうる
未定義動作というのは最適化において直感的にはわからない非常にまずいことが起こる場合があるので
避けたほうがよいだろう
■ このスレッドは過去ログ倉庫に格納されています