9

gcc マニュアルのこの部分はかなりあいまいで、繰り返し試行しても forceinline 属性の使用法を理解できません。

オブジェクトと、そのオブジェクトを操作する特定の関数を定義しています。これらの関数のうち、アトミック命令を使用できるものはほとんどなく、コンパイラーにそれらの関数をインライン化してもらいたいです。ただし、これらの関数をヘッダー ファイルに記述して、Linux カーネルのように「静的インライン」で宣言したくはありません。

gcc に別の翻訳単位の関数をインライン化させる方法はありますか?

4

1 に答える 1

10

always_inlineたとえば、次の属性を使用できます。

void foo () __attribute__((always_inline));

ドキュメントから

always_inline 通常、最適化が指定されていない限り、関数はインライン化されません。インラインで宣言された関数の場合、最適化レベルが指定されていなくても、この属性は関数をインライン化します。

注1 :属性inlineを使用する場合は使用する必要はありませんalways_inline

注 2 : 関数をインライン化できなかった場合は、警告が表示されます。たとえば、コンパイル時に定義が利用できない場合は、より高い最適化で gcc が呼び出し元にインライン化できます。そのための特定のスイッチもあります。

-funit-at-a-time

ドキュメントから:

特に、最適化レベル -O2 以上では、ユニット単位モードが有効になります。これにより、関数をコンパイルするときに、コンパイラはファイル内の後の関数から取得した情報を考慮することができます。ユニット単位モードで一度に複数のファイルを単一の出力ファイルにコンパイルすると、コンパイラは、各ファイルをコンパイルするときにすべてのファイルから取得した情報を使用できます

3 : 関数定義で属性を使用できるように、明示的なプロトタイプを用意する必要はありません。

__attribute__((always_inline)) void foo() {
   //some code
}

このディスカッションも参照してください。いくつかの質問に答えます。

于 2012-11-05T08:25:25.040 に答える