0

クラス MyClass で定義されたインラインメンバー関数があります

int MyClass::myInlineFunction();

この関数は、私のコードのいくつかの場所から呼び出されます。
この関数を呼び出す方法は 2 つあります
ケース 1: 関数が呼び出されるたびにこれを使用する。

mobj->myInlineFunction() ;

ケース 2: この関数の結果を変数に割り当て、それを後続のアクセスに使用する

var = mobj->myInlineFunction() ;

どちらを優先すべきですか??

4

7 に答える 7

3

ケース 2 では、関数が時間がかかる処理を行う場合に、多くのパフォーマンスを得ることができます。なら選ぶ

  • 関数の副作用が発生する必要はありません
  • 関数は常にそのコンテキストで同じ結果を返します
于 2009-06-27T09:37:00.680 に答える
1

パフォーマンスに問題がなくても、ケース 2 を使用します。この関数の結果だけを気にする場合は、それを変数に割り当てることで、後でこの結果を取得する別の方法に簡単に切り替えることができます。

于 2009-06-27T10:54:19.323 に答える
1

戻り値を保持するか、関数を再度呼び出すかの決定は、関数がインライン展開されているかどうかに基づいて行うべきではありません。経験則として、コードが複雑になりすぎない場合は、常に戻り値に固執します。クラスのユーザーとして、関数のコストが何であるか、そして今日の安価なものが何であるかがわからないためです。明日は高い。したがって、ケース 2 を使用します。

于 2009-06-27T09:39:03.780 に答える
0

残念ながら、単純な答えは 1 つではなく、関数によって異なります。

関数が些細なものであれば、{ return 6; のようなものです。}、毎回呼び出すだけです。コンパイラは呼び出しをインライン化し、コードを削除します。変数に割り当てるかどうかに違いはありません。

関数がより複雑な場合は、変数に割り当てる価値があるかもしれません。値はプログラム全体で一定ですか? 次に、値を含む静的メンバーをクラスに追加しますか?

于 2009-06-27T10:52:07.703 に答える
0

何をどこで最適化するかを知らずに最適化すると、通常、元のコードよりも高速ではない、より複雑なコードになります。

私にとって、使用するソリューションを決定する基準は、提供された情報に基づいていません。

  • メソッドがアクセサー ( std::vector<>::size() のように内部値を返すだけ) の場合は、インラインにして結果をキャッシュしません。
  • メソッドが重要な作業を実行する場合は、インライン化せずに、呼び出された回数とコストを測定します (インライン化されたメソッドは測定できません)。次に、キャッシングまたはインライン化が適切かどうかを判断します。
  • 結果のキャッシュ (ケース 2) は、高価なメソッドの改善になる可能性がありますが、使用間で値が変わらないことが保証されている場合に限ります。この場合、メソッドをインライン化しません。
  • アルゴリズムに悪影響を与える場合は、結果をキャッシュする必要があります (結果に基づいてメモリを作成し、そのメモリ チェックを使用して同じ結果でオーバーランします。値が変化すると、バッファがオーバーランします)。
于 2009-06-27T10:54:16.000 に答える
0

私が理解しているように、関数のインライン化と関数ポインターへの割り当ての関係を理解できません。

しかし確かに、最初の方法は自己文書化です。

編集::ありがとうアーメド、

それは実際には依存しており、一方が常に他方の代わりに使用できるとは限りません。

繰り返しますが、両方が機能する場合、少なくとも最初の方法の方が明確です。

于 2009-06-27T09:39:25.387 に答える
0

関数がすべての呼び出しに対して同じ結果を返す場合は、インライン関数であってもケース 1 を使用しても意味がないため、ケース 2 を使用する必要があります。

于 2009-06-27T09:42:33.820 に答える