質問

一部の人に愛用 inline キーワード C, し、大きな機能 ヘッダー.できると考え効果を発揮?私の考えではないも面倒なのではない。

私の原則である inline 用いるべきである小さな機能にアクセスもよく、またはのためにリアルタイプチェックしている。とにかく、味わいガイドがいえるにはどのようにすればよいのプライベートビーチにあり理由 inline がこんなに役立つ大きます。

この質問 人によると、コンパイラでより良い仕事を推測とは自分がすべきことなのだといいます。ることも私のすることが推定される。私が利用するようにして、この引数人の回答動作しない機能からの異なるオブジェクト。よくわかんない(例えば、GCC).

皆様のご回答!

役に立ちましたか?

解決

inline いつもの:

  1. ですから除外する"一定義規則"(以下参照)。この 常に 適用されます。
  2. のコンパイラのヒントを回避する機能。のコンパイラは無視します。

#1を確認することに非常に役立つなど入れの定義ヘッダが短い場合であっても、#2が無効になっています。

実際にコンパイラがいっていうインラインにしたもの(その場合のプロガイド最適化があります。


[編集:フル参考文献や関連するテキスト]

のアイデンティティの具体像を両方フォロからは、ISO/ANSI規格(ISO/IEC9899:1999年(E)、通称"C99").

§6.9"外部定義"条第5項の規定により、:

An 外部定義 社外宣言そのものの定義の機能その他のインライン定義またはオブジェクトです。場合には識別子なしで宣言されて外部連携で使用されてい表現以外のオペランドのsizeofオペレーターが果は整数定数)、どこかの全体のプログラムはこの限りではありま丁外部定義の識別子;そうしなければ、これらに該当すると認めます。

中equalivalent定義はC++言語によるexplictly名が'一定義規則(ODR)で同じ目的です。外観(な"静"は、このように地域のシングル翻訳機では、通常、単一のソースファイル)で定義されま ない限り 関数です インライン.

§6.7.4、"関数指示子"のインラインキーワードが定義されています:

作成機能、インライン機能と共通の機能として 高速していきます。[118] どの程度これらの提案が有効であ 実装で定義されています。

および脚注(基準値)が提供解明:

により、例えば、通常の機能電話機などの"インライン置換".インライン代替ではない文字列置換を行うものではありませんし、新規作成します。そのため、例えば、マクロの使用体内での機能の定義があったのを機体が表示されませんが、関数が呼び出され;および識別子の宣言の対象範囲の体が発生します。また、この機能はシングルアドレスグループ人数に関わらず、インライン定義で発生するほか、外部の定義で設定します。

概要:ほとんどがユーザーのCおよびC++に期待するインラインではないかを取得します。その見かけの目的な機能通話のオーバーヘッドはオプションです。が許可する分割コンパイル、リラクゼーションの定義が必要です。

(すべての重視からの引用を標準とする。)


編集2:A few notes:

  • 様々な制限の外部インラインで機能する。できない場合もありますので静的変数の機能とはできませんを参考に静的TU範囲の物体ます。
  • だがこのVC++'s"プログラム全体を最適化"との一例でコンパイラやって独自のインラインでもよい。

他のヒント

インライン宣言について重要なことは、それは必ずしも何もしないということです。コンパイラはそう宣言されていない機能をインライン化すると、インラインで宣言されている機能をリンクするために、多くの場合、することを決定して自由である。

あなたが大規模な機能のためにインラインで使用してはならないもう一つの理由は、ライブラリの場合です。古いヘッダに対してコンパイルされたアプリケーションは、まだ機能の古いバージョンをインライン化しているので、あなたがインライン関数を変更するたびに、ABIの互換性を失う可能性があります。インライン関数は、タイプセーフマクロとして使用されている場合は、チャンスは関数は、ライブラリのライフサイクルに変更する必要がないことを素晴らしいです。しかし、大きな機能のためにこれを保証することは困難である。

関数は、あなたの公開APIの一部である場合は、

もちろん、この引数にのみ適用されます。

の例では、インラインの利点を説明します。 sinCos.hます:

int16 sinLUT[ TWO_PI ]; 

static inline int16_t cos_LUT( int16_t x ) {
    return sin_LUT( x + PI_OVER_TWO )
}

static inline int16_t sin_LUT( int16_t x ) {
    return sinLUT[(uint16_t)x];
}

クランチいくつかの重い番号をやって、あなたがLUTと罪/ COSを置き換えるのcos /コンピューティングの罪にサイクルを無駄にしないようにしたいときます。

:あなたはインラインなしでコンパイルすると、

コンパイラのループを最適化しないであろうと、出力.ASMはの線に沿って何かを表示します

;*----------------------------------------------------------------------------*
;*   SOFTWARE PIPELINE INFORMATION
;*      Disqualified loop: Loop contains a call
;*----------------------------------------------------------------------------*
あなたがインラインでコンパイルすると、

コンパイラはループ内で発生し、それが正確に何が起こっているか知っているので、最適化するかについての知識を持っています。

出力.ASMが最適化されたループは(すなわち、それは完全にすべてのプロセッサののALUを利用しようとするとNOPSせずに完全なプロセッサのパイプラインを維持しよう)「パイプライン化」しています。

<時間>

この特定のケースでは、私はリアルタイムの締め切りのために必要なものの中に私を得た2Xまたは4X程度で自分のパフォーマンスを向上させることができました。

<時間>

p.s。私は、固定小数点プロセッサ上で働いていた...と罪/ COSのような任意の浮動小数点演算は、自分のパフォーマンスを殺します。

あなたが関数へのポインタを使用する場合、

インラインは無効です。

インラインが1の場合に有効である:あなたは、パフォーマンス上の問題を持っているとき、実際のデータを使用してプロファイラを実行して、有意であるといくつかの小さな関数の関数呼び出しのオーバーヘッドを見つけました。

。 あなたがそれを使用したい理由は、

その以外では、私が想像することはできません。

そうです。大きな機能のインラインを使用すると、コンパイル時間が増加し、アプリケーションに少し余分なパフォーマンスをもたらします。インライン関数は、関数が呼び出さずに含まれるようにするコンパイラに伝えるために使用されており、このようなことがなければならない小さなコードは何度も繰り返しました。言い換えれば、大きな機能のために、独自の機能の実装のコストに比べて電話をかけるのコストはごくわずかです。

私は主にタイプセーフなマクロとしてインライン関数を使用します。 LLVMは、一緒に来て、特に以来、かなりの時間のためのGCCへのリンク時の最適化のためのサポートを追加することについての話がありましています。でも、私は実際にはまだ実装されているどのくらいのかわからない。

あなたが最初にあなたのコードでプロファイラを実行しており、部分的にインライン化することによって軽減することができる、そのルーチンに重大なボトルネックがあることが実証されていない限り、

個人的に私は、あなたがのこれまでののインラインすべきではないと思いますます。

これはクヌースはについて警告早期の最適化のさらに別のケースです。

インラインは、ゲッターやセッターメソッドとして小さく、頻繁に使用する機能のために使用することができます。大きな機能のために、exeファイルのサイズを大きくすると、インラインを使用することはお勧めできません。 また、再帰関数のために、あなたはインラインを作る場合でも、コンパイラはそれを無視します。

  1. inline 行為としてのヒントだけます。
  2. 付加のみ、ごく最近に至り、その作品と最新の基準に準拠したコンパイラでコンパイル.

インライン関数は、約10行以下にしてお好みのコンパイラに依存し、与えるか、または取る必要があります。

これを行うために、そのアップコンパイラに..あなたが何かをインライン化したいあなたのコンパイラに伝えることができます。コンパイラは無視することはできませんそのうち、私が知っている何-force-inlineオプションはありません。あなたはアセンブラ出力を見て、あなたのコンパイラは、実際の をやったかどうかを見る機能をインライン化すべき理由がある、ない場合は、なぜ?多くのコンパイラはただ黙って君をネジ!」と言っその点でます。

もしそうなら:

静的インラインunsigned int型のfoo(CONSTのchar *バー)

..静的int型のfoo()あなたの最適化(およびおそらくループ)を再訪したり、コンパイラと議論するためにその時間をかけて物事を改善しません。あなたは次の日、あなたの受信トレイを開いたときに不快な読書の多くのために、最初にあなたのコンパイラと議論するために特別な注意を払う、それを開発しない人...か、あなただけの店でます。

何か(または何かを作るしようとして)インラインを作るとき、

一方、実際に肥大化を正当化しそうですか?あなたは本当にのすべてのの時間のが呼び出され、その関数を拡張したいですか?ジャンプは中間出力(またはASMダンプを)確認し、あなたのコンパイラは通常、正しい9/10倍である?,ので、高価である。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top