Cの静的インライン(C ++ではない)とは何ですか?多くの関数が「静的インライン」として宣言されている理由について、私はよく混乱しています。 Linuxカーネルの場合。


ベストアンサー

関数が static として定義されている場合、その関数は次のことができます。同じソースファイル内でのみ表示および使用されます。定義されているソースファイルの外部から呼び出すことはできません(関数ポインタを使用して呼び出す場合を除く)。関数は、現在のソースファイルの外部のビューから事実上「非表示」になっています。

関数がインラインとして定義されている場合、関数への呼び出しを生成するのではなく、関数の呼び出しが行われる場所で関数の内部のコードを生成するコンパイラ。この手法は、関数呼び出しのオーバーヘッドを排除することでパフォーマンスを向上させることができますが、結果として、生成されるコードのメモリフットプリントを増やす可能性があります。ただし、コンパイラは関数のコードをインラインで生成する義務を負わないため、関数が長すぎるか複雑である場合、またはコンパイラが何らかの理由でそれを実行できない場合は、通常の関数呼び出しが生成されます。そのため、インラインはコンパイラへのヒントにすぎないと言います。

これらを組み合わせると、両方の

static およびインラインは、現在のソースファイルの外部では表示されないものであり、そのコードはコンパイラが実行できる場合は、呼び出す場所を問わずインラインで生成されます。このアプローチは、パブリックAPIの一部ではない、非常に小さく、単純で、頻繁に呼び出される内部ヘルパー関数に一般的に使用されます。

回答

インライン関数の場合、次のコードはそれらは、関数呼び出しのオーバーヘッドなしで呼び出し関数にコピーされます。

カーネルでは広く使用されています。これは通常、パフォーマンスを向上させ、最適化を強化する方法として行われますが、必ずしもそうとは限りません。

主にタイムクリティカルな小さな関数に使用され、そうすることでパフォーマンスに大きな違いが見られます。

ただし、インラインキーワードを使用していない場合でも、コンパイラは最適化の一環としてインライン化を試みます。

経験則として、静的インライン関数はヘッダーに含める必要があります。これは、内部リンケージを持つインライン関数を定義します。したがって、そのような関数は翻訳ユニットに対してローカルであり、その中にインラインであると言えます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です