仕事で、Cコンパイラ(gcc)のオプティマイザのスゴ技が予想外だったので、思わぬ苦労をした。

そのスゴ技というのは、結果が分かり切っている場合は、関数の実行やif文の中まで省略しちゃうのだ。野球で最終回の裏をやらないみたいなものか。出力のアセンブラを見た訳ではないのだが、実行結果を見ると、そうとしか思えなかった。

例: 以下のコード中の関数strchrは実行されず、ifの中の処理2も生成されないようだ。

{
  char *s= strchr("AAA.BBB", '.');
  if (s) {
     処理1
  } else {
     処理2
  }
}

上は、コンパイルすると、以下のようになってしまうようだ。

処理1

どうして分かったかというと、コンパイルし直さずに動作を処理2に変える必要があって、バイナリエディットして実行プログラム中の"AAA.BBB"の"."以降を空文字列("\0\0\0\0")に置き換えたのだが、それでも処理2が実行されなかったからだ。

でも、本当なのだろうか? やり過ぎのような気がする。明日、アセンブラを見て確認したくなった。

アセンブラを見たのだが、Cのソースは出ないので、分かりずらかった。ただ、strchrは呼ばれていないことは確かだった。てことは、当然、処理2のコードも生成されていないだろう。(6/19 19:17)

  •   0
  •   0

コメントを書く

名前    

メール 

URL