これをインライン化する必要があるかどうかわかりません:
float bm_softlight (float a, float b) {
float Da = (a > 0.25f) ? sqrt (a) : ((16*a - 12) * a + 4) * a;
return (b > 0.5f) ? Da*(2*b - 1) + 2*a*(1-b) : 2*a*b + a*a*(1-2*b);
}
インライン化できる関数は十分に単純ですか?
ありがとう
これをインライン化する必要があるかどうかわかりません:
float bm_softlight (float a, float b) {
float Da = (a > 0.25f) ? sqrt (a) : ((16*a - 12) * a + 4) * a;
return (b > 0.5f) ? Da*(2*b - 1) + 2*a*(1-b) : 2*a*b + a*a*(1-2*b);
}
インライン化できる関数は十分に単純ですか?
ありがとう
いつインライン化するかという具体的な答えはありません。Inline
コンパイラへの単なるヒントです。したがって、それを無視するか、ヒントなしでインライン化することができます。
インライン化の場合、パフォーマンスが向上する場合と低下する場合があります。パフォーマンスが低下する理由の 1 つは、インライン化によってコードの側面が増加し、キャッシュ フレンドリーでなくなる可能性があることです。コードが機能するかどうかは言うまでもなく、試してみてくださいinline
。
ボトルネックが見つかるまで最適化しない
最新のコンパイラが行う最適化により、 の使用inline
はそれほど明白で透過的ではありません。インライン化が宣言されていなくても、コンパイラが自動的に小さな関数をインライン化することがあります。一方、関数をインライン化するように宣言しても、関数をインライン化しない場合があります。
何がコストがかからないのか、つまり関数呼び出しか、コードの複製かがわからないため、それを実際に判断することはできません (できるかもしれませんが、一見すると簡単ではありません)。一方、コンパイラはそれをかなりうまく管理します。
また、Donald Knuth の有名な引用を思い出してください。
時期尚早の最適化は、プログラミングにおけるすべての悪 (または少なくともその大部分) の根源です。
sqrt
and 条件は、余分な呼び出しよりもはるかに多くの時間がかかると思います。とにかく、inline
ヒントだけです。
実装をソースファイルに分離したい場合は、指定してもしなくてinline
も問題ありません。
定義をヘッダーに保持する場合は、複数の定義を防ぐために関数を宣言する必要があります。inline
これは、関数が実際にインライン化されるということではありません。