1

C でプログラミングしています。静的関数とインライン関数について説明したいと思います。関数を静的にすると、それが1つの翻訳単位のみの内部リンケージ下にあることがコンパイラーに示されることを私は知っています。static と inline に関して次の疑問があります。

  1. 関数を static として作成した場合、他の翻訳単位で使用できますか?つまり、他の .c ファイルで使用できますか? はいの場合..どのように?
  2. 関数を静的インラインとして作成すると、違いは何ですか? コンパイラによってどのように扱われますか?
  3. 関数を静的にすると、マクロと同じ効果が得られますか?
  4. 関数をインラインとして扱うことは、サイズに応じてコンパイラに依存します。では、強制的にインラインのように扱う方法はありますか?
  5. 最適化のためにインライン関数と静的関数をどのように使用できますか?

上記のことをインラインで説明してください。プラットフォームは Linux、gcc コンパイラ、C 言語です。

4

3 に答える 3

4
  1. 関数は他のstatic翻訳単位では使用できません。それが彼らの存在理由です。

  2. inline関数を呼び出す代わりにインライン化する必要があることをコンパイラに示唆します。

  3. 関数を静的にすることは、マクロを使用することとは異なります。マクロは、基本的にコンパイラを無効にします。インライン化することが賢明であると考えるかどうかにかかわらず、マクロはインライン化されます。マクロはテキスト置換です。static関数ポインターを必要とするものに関数を渡すこともできます。マクロではできません。

  4. マクロは何でも強制的にインライン化します。指定してinlineも覆すことができます。

  5. エクスポートしたくない関数を作成しますstatic。関数が非常に小さく、インライン化する必要があると本当に考えている場合は、inline. マクロは、実際にはメタプログラミング専用です。コンパイラはあなたよりもよく知っています。

于 2012-04-30T04:26:23.113 に答える
3

staticそしてinline2つの非常に異なる目的を果たします。

あなたが正しく言うようstaticに、関数のシンボルはそれが定義されているコンパイルユニットからエクスポートされないことを意味します。したがって、異なるコンパイル単位は、競合することなく同じ名前のそのようなシンボルを持つことができます。これが同じ関数宣言と定義に対応するかどうかはあなた次第です。ただし、静的に割り当てられたすべてのオブジェクトなどの関数は、ポインターを静的または動的にエクスポートすることにより、別のコンパイル単位で使用できます。

inline異なります。その目的は、コンパイラーが関数、つまり名前をインライン化できるようにすることですが、その主な直接的な効果は、関数記号が通常はまったく出力されないことです。これは、関数の定義をヘッダーファイルに入れ、それぞれに複数のシンボルを作成せずに、そのファイルを複数のコンパイル単位に含めることができるように設計されています。定義された関数の場合、そのオブジェクトをどのコンパイルユニットで実現する必要があるかがまったく明確にならないためstatic、関数内で変数を宣言できないという効果もあります。inline

要約staticすると、関数のコピーをたくさん生成しますが、inline何も生成しません。ファイルやでstatic主に使用されています".c"inline".h"

1つ目は、特定の場所で2つの関数ポインターが「同じ」関数を指していることを検出しない可能性があるという効果があります。2つ目は、関数への関数ポインターが必要な場合、それが対象とする関数オブジェクトがないという効果があります。参照。このような関数は、.cファイルに一種の「インスタンス化」を配置することで(1つのコンパイル単位で!)強制的に発行できます。

// .h definition
inline void toto(void) { }

// .c instantiation
void toto(void);
于 2012-04-30T08:44:23.237 に答える
1

最近のコンパイラは、すべての関数が適切な候補であるとは限らないため、インライン関数が実際にインライン化されるかどうかを判断します。その場合、関数本体は、それぞれの関数が参照される場所に単純に挿入/インライン化されます。

このような関数は、関数本体が通常非常に短い頻繁な関数呼び出し用に予約する必要がありますが、そうである必要はないと思います。

于 2012-04-30T04:24:09.063 に答える