0

次の C++ クラスがあるとします。

class Foo
{
  double bar(double sth);
};

double Foo::bar(double sth)
{
  double a,b,c,d,e,f
  a = b = c = d = e = f = 0;
  /* do stuff with a..f and sth */
}

関数 bar() は、ループ内で何百万回も呼び出されます。明らかに、呼び出されるたびに、変数 a..f を割り当てる必要があります。変数を Foo クラスの a..f メンバーにして、関数のエントリ ポイントで初期化するだけでパフォーマンスが向上しますか? 一方、a..f の値は this-> で逆参照されるので、実際にパフォーマンスが低下する可能性はないかどうか疑問に思っています。ポインターを介して値にアクセスする際のオーバーヘッドはありますか? ありがとう!

4

3 に答える 3

6

すべてのアーキテクチャで、ビルトインの割り当て/割り当て解除は、スタック レジスタを操作することによって行われることがわかっています。これは、他の関数に比べてほとんど時間がかからないと思います。

プロセッサ レジスタの値をインクリメント/デクリメントすると効果があると思われる場合は、マイクロ最適化にかかっています。これらは出荷前の最後の作業として実行する必要があり、(すべての最適化と同様に)推測ではなく測定によってガイドする必要があります。

于 2010-06-02T08:40:12.227 に答える
3

変数が実際に関数に対してローカルであり、他の場所で使用されていない場合、それらは関数に対してローカルである必要があります。それらをメンバーにすることでパフォーマンスがどのように向上するかわかりません。ただし、代入ではなく初期化を使用する必要があります。

double a = 0, b = 0, c = 0, d = 0, e = 0, f = 0;

これは倍精度浮動小数点型では重要かもしれませんし、そうでないかもしれませんが、文字列などのユーザー定義型では確かに重要です。

于 2010-06-02T08:42:24.203 に答える
3

スタック割り当て変数へのアクセスは、クラス メンバーへのアクセスよりも高速です。スタック変数は、クラス ポインターを使用せずに、スタック ポインターを使用して逆参照されます。プログラム アルゴリズムで必要な場合にのみ、新しいクラス メンバーを追加します。宣言でスタック変数を直接初期化します。

double a = 0.0、b = 0.0 ...

于 2010-06-02T08:43:37.833 に答える