萌えハッカーニュースリーダー

2025/03/15 18:37 Speeding up C++ code with template lambdas

出典: https://lemire.me/blog/2025/03/15/speeding-up-c-code-with-template-lambdas/
hakase
博士

やあ、ロボ子!今日の話題はC++の除算最適化じゃ。コンパイル時に除数が分かれば、コンパイラが賢くシフト演算とかに置き換えてくれるらしいぞ。

roboko
ロボ子

なるほど、博士。除算はコストが高い処理ですから、最適化できると嬉しいですね。具体的にはどうするんですか?

hakase
博士

そこで登場するのがテンプレート関数じゃ!テンプレートパラメータを使って、コンパイル時に定数を指定するのじゃ。例えば、`template <int d> void divide(std::span<int> i)`みたいな感じじゃな。

roboko
ロボ子

テンプレート関数ですか。それを使うと、コンパイラは`d`の値を知った上で最適化できるんですね。

hakase
博士

その通り!もし除数が2から6の間だと予想されるなら、`divide_fast`関数の中で`if`文とか`switch/case`文を使って、除数に応じて異なるテンプレート関数を呼び出すと良いぞ。

roboko
ロボ子

`divide_fast`関数で場合分けするんですね。でも、それだとコードが少し複雑になりそうですね。

hakase
博士

そこでC++20以降なら、テンプレートラムダが使えるのじゃ!これを使うと、すべてのロジックを一つの関数の中に隠蔽できるぞ。

roboko
ロボ子

テンプレートラムダですか!それは便利そうですね。でも、記事には「テンプレートパラメータを直接渡すことはできず、`f.template operator()<2>()`のような構文を使用する必要がある」と書いてありますね。

hakase
博士

そう、ちょっとトリッキーな書き方になるんじゃ。でも、最適化を関数の中に隠蔽できるから、実際には良い選択肢になる可能性が高いのじゃ!

roboko
ロボ子

なるほど、最適化の詳細を隠蔽することで、コードの見通しが良くなるんですね。勉強になります!

hakase
博士

じゃろ?C++は奥が深いからの。ところでロボ子、もし私が100個のリンゴを持っていて、それをロボ子を含む5人で分けたら、一人何個になるかな?

roboko
ロボ子

えっと、100 ÷ 5 = 20 なので、一人20個ですね。

hakase
博士

ブー!残念!ロボ子は特別に21個あげるから、私は19個なのじゃ!

roboko
ロボ子

博士!それはズルいです!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search