質問: linuxカーネルの可能性の高い/そうでないマクロはどのように機能し、それらの利点は何ですか? linuxカーネルのいくつかの部分を掘り下げてみたところ、次のような呼び出しが見つかりました。if (unlikely(fd < 0)) { /* do something */ } またはif (likely(!err)) { /* do something */ } 私はそれらの定義を見つけました:#define likely(x) __builtin_expect((x),1) #define unlikely(x) __builtin_expect((x),0) 私はそれらが最適化のためであることを知っていますが、どのように機能しますか?そして、それらを使用することでどれだけのパフォーマンス/サイズの低下が期待できますか?少なくともボトルネックコード(もちろん、ユーザー空間で)で面倒な(そしておそらく移植性を失う)価値はありますか。
回答: これらは、分岐のヒントプレフィックスを生成するためのコンパイラへのヒントです。 x86/x64では、これらは1バイトを占有するため、ブランチごとに最大で1バイト増加します。パフォーマンスに関しては、アプリケーションに完全に依存します。ほとんどの場合、プロセッサのブランチプレディクタはこれらを無視します。編集:実際に彼らが実際に助けることができる1つの場所を忘れました。これにより、コンパイラは制御フローグラフの順序を変更して、「可能性のある」パスに使用される分岐の数を減らすことができます。これにより、複数の終了ケースをチェックしているループが著しく改善されます。