なんだか某スレがすっかり、インライン展開の話になってしまってるけど。
別の翻訳単位でも、関数オブジェクトを使う価値はある。リンク時に最適化をするような、モダンなコンパイラの場合、インライン展開してくれる。
(と、コレを書いているうちに、VC8の最適化されたコードが貼られている。アク禁はつらい)
とはいっても、そもそも、いまどきインライン展開する意味はどれだけあるのか疑問なのだが。
第一CPUは早い。しかもモダンなCPUは、関数呼び出しされるたびに、見えないレジスタに呼び出し元をこっそり記録しておくとか、わけの分からないことまでやっている(そして、スタックは常にメモリにあるはずという推定の元に、命令数の削減だけを考えて、pushとpopが一致しないコードを書くと、むしろ速度が遅くなる)
そして関数の中にif文でもあろうものなら、最近のヘビーなパイプラインのCPUは、関数呼び出しなど目じゃないほど無駄な処理をする。
そして、関数がインライン展開されると、それだけコードが太る。キャッシュに乗り切らなくなる。
No comments:
Post a Comment