2011-10-19 11 views
2

私のプロジェクトでは、いくつかのヘルパー関数を呼び出すタイトな内部ループがあります。私ImageCommon.hファイルにGCCの別ファイルからの関数のインライン化

BOOL isValidPoint(CGPoint point) __attribute__((always_inline)); 

、およびとして実装さ:最大のパフォーマンスを得るために、これらの単純な機能は次のように宣言されているImageCommon.mに

inline BOOL isValidPoint(CGPoint point); 

。言い換えれば、私はいつもこれらの関数をインライン化したいと思っています。

ImageCommon.mの他の関数からisValidPointを呼び出すと、逆アセンブリ出力はisValidPointへの関数呼び出しが消去されたことを確認します。しかし、私が別のソースファイルからこの関数を呼び出すと、関数呼び出しはそのまま残ります - インライン化されません。

1つのインプリメンテーションファイルで呼び出され、別のインプリメンテーションファイルで呼び出される関数をインライン化することはできますか?

答えて

1

あなたの関数を他のコンパイル単位にインライン展開するには、その関数の定義をコンパイル単位で表示する必要があります(つまり、ヘッダーに含める必要があります)。

また、使用しているコンパイラに応じて、リンク時の最適化を行うことができます。

-2

私の答えは、90:10の最適化のルールに従っているということです。基本的にはプログラマの90%がは、彼らが何をインライン化していない、彼らは(他のいくつかのルールからのリッピングをオフ)を最適化するために必要なコードの10%基本的に

を推測するのは10%の確率を持っているので、何を最適化するために、知らない - みましょうコンパイラdo

+1

私は広範なプロファイリングを行っています。これらの関数をインライン化することは絶対に価値があり、コンパイラはそれを単独では行いません。 – Bill

+0

どのようにプロファイリングしましたか?プログラム全体の最適化を使用していますか?プロファイリングを使用してコンパイルし、プロファイルデータを使用して再コンパイルして、オプティマイザの動作を支援していますか? –

2

「インライン」ではなく「静的なインライン」を宣言してみてください。コンパイラはそれを翻訳単位のローカルとして扱い、実際にインライン化できるかどうかを判断する必要があります。

編集:申し訳ありませんが、この機能が翻訳単位で定義されていることを確認できませんでした。定義は、動作するには '静的インライン'の.hに移動する必要があります。

関連する問題