だから私はコンパイラで少し実験を行っています (私は C++ の「キャリア」のその時点まで来ています) への呼び出し_rotl
が直接コンパイル/アセンブルされることに気付きました。つまり、アセンブリが a を実行する代わりにcall
、(2 つだけではありますが) オペコードが呼び出しの場所に直接カット/ペーストされているように見えます。
この背後にある理由は何ですか?この用語は「インライン関数」だと思いますが、間違っている可能性があります。
だから私はコンパイラで少し実験を行っています (私は C++ の「キャリア」のその時点まで来ています) への呼び出し_rotl
が直接コンパイル/アセンブルされることに気付きました。つまり、アセンブリが a を実行する代わりにcall
、(2 つだけではありますが) オペコードが呼び出しの場所に直接カット/ペーストされているように見えます。
この背後にある理由は何ですか?この用語は「インライン関数」だと思いますが、間違っている可能性があります。
これはインライン関数ではなく、組み込み関数です。ターゲット プロセッサの特定の機能を利用するように設計されています。これは、関数をインラインで宣言することなく無条件にインライン化され、通常は単一のマシン コード命令のみを生成します。_rotl() の場合、x86 ROL 命令を使用します。
inline
C ++のキーワードは、call
アセンブリコマンド(プロセッサ命令)によって発生するオーバーヘッドを削減するために、特定の関数(通常は短い)をインラインにすることをコンパイラに提案します。
ただし、これは単なる提案であるため、明示的にマークされていない他の短い関数inline
もインライン化できます。また、特に関数が非常に大きい場合は、インライン化の要求を無視することもできます。
インライン化操作自体は、基本的に、関数を呼び出す必要なしに、使用されるすべての場所に関数の本体をコピーします。
あなたはいつでもそれについてグーグルで検索して、いくつかのより多くの情報を見つけることができます。
編集:インライン化は通常、最適化がオンになっている場合にのみ/ほとんど発生します。それらのオンとオフを切り替えて、分解を比較してみてください。
インライン化は効率化のために行われます。call
まず、関数'in-line'を本質的に挿入することにより、のコストを節約します。つまり、その関数のコピーを作成し、呼び出しが元々あった場所に挿入します。第二に、実行されるコードは互いに接近しているため、空間的な局所性のためにキャッシュに役立ちます。
関数がループで呼び出されている場合、関数は通常インライン化され、このオーバーヘッドがより重要になります。inline
このキーワードを使用して、関数をインライン化することをコンパイラーに示唆することができますが、コンパイラーがそうする義務はありません。コンパイラ固有のキーワードを使用して、インラインを強制することができます。たとえば、__forceinline
VC++を使用します。