switch文 vs if文

※少なくともVC++2008の場合。

VC++のコンパイラは結構頭が良い。こんな最適化だってあった。
if elseにしたって、switch文と同性能のコードがされるんだろう・・・と思っていたら、実はそうではなかったようで・・・。

switch文の場合はジャンプテーブルで作成される。アセンブラコードで見ると

jmp   dword ptr  (4012A4h)[ecx*4] 

みたいな風になっている。ecxにはswitch文として指定した数値が入っていて、このアセンブルコードならば 4012A4h にジャンプテーブルが置いてある。ecxに*4しているのは、テーブルに書いてあるアドレスの一つが4バイト(32bit)であるため。後はそのジャンプテーブルのアドレスにジャンプすれば良い。ワンステップ。すごく速い。

一方、if elseの羅列の場合、律義にジャンプテーブルも使わず、一つづつチェックしているようで・・・。
例えジャンプテーブルに変換可能なようなif else文であってもそこまで見てはくれないらしい・・・。当然遅い。

と言う事で、コンパイラが結構頭良くなって来た今の時代でも、こう言った奴は未だにswitch文で書いてあげた方がいいようです。