0

これをインライン化する必要があるかどうかわかりません:

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);
}

インライン化できる関数は十分に単純ですか?

ありがとう

4

3 に答える 3

4

いつインライン化するかという具体的な答えはありません。Inlineコンパイラへの単なるヒントです。したがって、それを無視するか、ヒントなしでインライン化することができます。

インライン化の場合、パフォーマンスが向上する場合と低下する場合があります。パフォーマンスが低下する理由の 1 つは、インライン化によってコードの側面が増加し、キャッシュ フレンドリーでなくなる可能性があることです。コードが機能するかどうかは言うまでもなく、試してみてくださいinline

ボトルネックが見つかるまで最適化しない

于 2012-07-18T13:36:34.320 に答える
3

最新のコンパイラが行う最適化により、 の使用inlineはそれほど明白で透過的ではありません。インライン化が宣言されていなくても、コンパイラが自動的に小さな関数をインライン化することがあります。一方、関数をインライン化するように宣言しても、関数をインライン化しない場合があります。

何がコストがかからないのか、つまり関数呼び出しか、コードの複製かがわからないため、それを実際に判断することはできません (できるかもしれませんが、一見すると簡単ではありません)。一方、コンパイラはそれをかなりうまく管理します。

また、Donald Knuth の有名な引用を思い出してください。

時期尚早の最適化は、プログラミングにおけるすべての悪 (または少なくともその大部分) の根源です。

于 2012-07-18T13:36:35.723 に答える
1

sqrtand 条件は、余分な呼び出しよりもはるかに多くの時間がかかると思います。とにかく、inlineヒントだけです。

実装をソースファイルに分離したい場合は、指定してもしなくてinlineも問題ありません。

定義をヘッダーに保持する場合は、複数の定義を防ぐために関数を宣言する必要があります。inlineこれは、関数が実際にインライン化されるということではありません。

于 2012-07-18T13:53:59.510 に答える