公式文書:
hot
関数の hot 属性は、その関数がコンパイル済みプログラムのホット スポットであることをコンパイラに通知するために使用されます。関数はより積極的に最適化され、多くのターゲットでテキスト セクションの特別なサブセクションに配置されるため、すべてのホットな関数が近くに表示され、局所性が向上します。-fprofile-use を介してプロファイル フィードバックが利用可能な場合、ホットな機能が自動的に検出され、この属性は無視されます。
関数の hot 属性は、4.3 より前の GCC バージョンでは実装されていません。
ラベルの hot 属性は、ラベルに続くパスがそれほど注釈されていないパスよりも可能性が高いことをコンパイラに通知するために使用されます。この属性は、__builtin_expect を使用できない場合 (たとえば、computed goto または asm goto など) に使用されます。
ラベルの hot 属性は、4.8 より前の GCC バージョンでは実装されていません。
2007年:
__attribute__((hot))
マークされた関数が「ホット」であり、より積極的に最適化するか、他の「ホット」関数の近くに配置する必要があることを示します (キャッシュの局所性のため)。
ギラッド・ベン=ヨセフ:
その名前が示すように、これらの関数属性は、対応する関数がコード内で頻繁に呼び出される (ホット) か、めったに呼び出されない (コールド) ことをコンパイラーに示唆するために使用されます。
次に、コンパイラは、実行される分岐がホットな関数を呼び出す可能性が高いという仮定の下で、これらのホットな関数を呼び出す分岐を優先し、コールドな関数を嫌うように、if ステートメントなどの分岐内のコードを順序付けることができます。冷たいものと呼ぶ可能性は低くなります。
さらに、コンパイラは、生成されたバイナリの特別なセクションでホットとしてマークされた関数をグループ化することを選択できます。これは、データと命令のキャッシュが局所性、または関連するコードとデータの相対距離に基づいて機能するため、すべての関数を一緒に呼び出すことが多いため、アプリケーション全体のコードのキャッシュが改善されます。
hot 属性の適切な候補は、コード ベースで非常に頻繁に呼び出されるコア関数です。エラーが発生した場合にのみ呼び出される内部エラー処理関数は、cold 属性の適切な候補です。
したがって、これらの情報源によると、次のことを__attribute__ ((hot))
意味します。
- この関数への呼び出しを最適化する
- この関数の本体を最適化する
- この関数の本体を
.hot
セクションに配置します (すべてのホット コードを 1 つの場所にグループ化するため)
(lookup_attribute ("hot", DECL_ATTRIBUTES (current_function_decl))
ソースコード分析の後、「ホット」属性は;でチェックされていると言えます。true の場合、関数は( predict.c, compute_function_frequency()node->frequency
) に設定され ます。NODE_FREQUENCY_HOT
関数の頻度が の場合NODE_FREQUENCY_HOT
、
プロファイル情報がなくlikely/unlikely
、分岐がない場合maybe_hot_frequency_p
は、関数に対して true を返します (== "...頻度 FREQ はホットと見なされます。")。これによりmaybe_hot_bb_p
、関数内のすべての基本ブロック (BB) の値が true になり (「BB は CPU を集中的に使用する可能性があり、最大のパフォーマンスを得るために最適化する必要があります。」) maybe_hot_edge_p
、関数内のすべてのエッジで true になります。次に、非-Os
モードでは、これらの BB とエッジ、およびループも、サイズではなく速度に対して最適化されます。
この関数からのすべてのアウトバウンド コール エッジに対して、cgraph_maybe_hot_edge_p
true を返します (「コールがホットである可能性がある場合は true を返します。」)。このフラグは IPA (ipa-inline.c、ipa-cp.c、ipa-inline-analysis.c) で使用され、インラインおよびクローニングの決定に影響を与えます