2

Linuxでgccを使用してCで開発しています。

次の方法で、小さな関数を .H および .C ファイルに整理しています

      // .H file
      extern int my_function( int val );

      // .C file
      inline int my_function( int val ){
          // my job..very short!
      }

これらの関数は小さいため、インライン化するのに非常に適していますが、確実かどうかはわかりません。

私は自分のファイルを整理する方法に疑問を持っており、.C ファイルを使用せずにすべての関数を .h ファイルに直接インライン化する方がよいのではないかと考えていました。私の疑問を明確にするために少し手伝ってもらえますか?

4

3 に答える 3

3

まず、オプションを追加することで、 gccに小さな関数を呼び出し元にインライン化するように指示できることに注意してください。-finline-functions

関数が実際にインライン化されることに疑いがある場合は、以下を使用して、 gccにインライン化できない関数について警告するように依頼できます。-Winline

ここでは、関数が と の両方externで宣言されinlineているため、定義はインライン化にのみ使用されるため、インライン化されますinlineこの特定の状況では、関数はそれ自体ではまったくコンパイルされません。

詳細については、http: //gcc.gnu.org/onlinedocs/gcc/Inline.htmlを参照してください。

于 2012-03-30T16:33:38.160 に答える
2

関数がどんなに小さくても、それをインライン化するかどうかはコンパイラが選択します。

したがって、関数の数が非常に少なく、それらをすべてコード内でインライン化したとしても、すべてがコンパイラによってインライン化されるという保証はありません。

ここで、インライン化に関する便利なヒントを見つけることができます。

于 2012-03-30T15:58:58.743 に答える
0

まず、関数をインライン化するには、関数の定義をコンパイラが認識できる必要があります。したがって、ヘッダー ファイルに定義を配置する必要があります。(ここでは、アプリケーションが複数のソース ファイルで構成されていると想定しています)。注: 一部の開発環境では、複数ファイルのコンパイルがサポートされています。その場合、この注意事項は適用されません。

第 2 に、インライン C99 のセマンティクスは、C++ に慣れている場合は少し混乱します (物事が「正常に機能する」場合)。C99 では、関数を所有する単一のソース ファイル (ヘッダー ファイルではない) を選択する必要があります。関数が一部のソース ファイルでインライン化されていない場合は、関数の明示的な定義が 1 つだけ存在する必要があります。これは、externキーワードを使用して関数を指定することによって行われます。extern(これは、宣言のみに使用されていた の従来の解釈からの逸脱です)。

例えば:

  // .h file
  inline int my_function( int val )
  {
      // my job..very short!
  }

  // In ONE .c file
  extern int my_function( int val );
于 2012-03-31T09:23:30.197 に答える