3

floatたとえば、 a を2つの構造にカプセル化したいと思います。

struct AngleDeg {
    explicit AngleDeg(float angle):value(angle) {}
    float value;
};

struct AngleRad {
    explicit AngleRad(float angle):value(angle) {}
    float value;
};

次に、クラスでこれらの構造体を使用して関数をオーバーロードします。次のようになります。

...
void DoStuff(AngleRad angle);
inline void DoStuff(AngleDeg angle) { DoStuff(Deg2Rad(angle.value)); }
...

これは、次の 2 つの関数を使用するのと同じくらい効率的ですか?

void DoStuffRad(float angle);
inline void DoStuffDeg(float angle) { DoStuffRad(Deg2Rad(angle)); }
4

5 に答える 5

5

プログラムの実行速度には影響しない可能性がありますが、プログラムが正しくなる可能性が高くなります。それは効率的です!

于 2012-07-29T09:21:13.770 に答える
1

スペースとアクセスについては@jalfと同じだと思いましたが、よくわかりませんでした。そこで、@ quamranaと@jalfを聞いて、ランタイムテストを行いました。

デバッグモードでは、構造体を使用したアプローチは約30%遅くなりますが、リリースモードでは同等です。コンパイラに依存する可能性がありますが、構造体を使用したアプローチを使用します。

于 2012-07-29T10:09:01.233 に答える
1

確かに言うことは不可能です。100% 確実にしたい場合は、生成されたアセンブリを確認してください (または、コードの実行時間を確認してください)。

ただし、役立つ可能性のある2つの観察事項:

  • まず、structは と同じサイズfloatなので、無駄なスペースはありません。また、不必要な間接化はありません。含まfloatれているものには、以前と同じように効率的にアクセスできます。したがって、遅くする必要がある根本的な理由はありません
  • ただし、これにより特定のコンパイラの最適化が失われる可能性があります。おそらく、場合によってstructは組み込み型とは異なるコードを s に対して生成するだけです。floatsまたは、「のサイズのオブジェクト」とは異なる呼び出し規約を使用している可能性がありfloatます。

だから、そうかもしれないし、そうじゃないかもしれない。しかし、速度の違いが測定可能な違いになるとは考えにくいです。

于 2012-07-29T09:52:56.397 に答える
1

この質問は、C++ パフォーマンスに関するテクニカル レポートで調査されました。Stepanov 抽象化ペナルティ ベンチマークについては、付録 D.3 を参照してください。引用する

ベンチマークの構造は実にシンプルです。配列に 2000 個の double を 25000 回追加します。それを行うためのより抽象的な方法を導入する 13 の異なる方法でそれを行います:
0 - 単純な Fortran のような for ループを使用します。
1 - 12 plus 関数オブジェクトで STL スタイルの累積テンプレート関数を使用します。
1、3、5、7、9、11 は double を使用します。2, 4, 6, 8, 10, 12 は Double を使用します - クラスで二重にラップされます。
1、2 - 通常のポインターを使用します。
3、4 - クラスにラップされたポインターを使用します。
5、6 - 逆反復子アダプターでラップされたポインターを使用します。
7、8 - 逆反復子アダプターでラップされたラップされたポインターを使用します。
9、10 - 逆反復子アダプターでラップされた逆反復子アダプターでラップされたポインターを使用します。
11、12 - 逆反復子アダプターでラップされた逆反復子アダプターでラップされたポインターを使用します。

Ideoneの出力: 最新のコンパイラ (gcc 4.5.1) の抽象化ペナルティ (13 個のテストすべての幾何平均) は 1% 未満です。

于 2012-08-08T10:43:45.960 に答える
0

お金に見合う価値のあるコンパイラーの場合(無料であっても)、プレーンフロートを使用するよりもオーバーヘッドはありません。

于 2012-07-29T10:07:23.840 に答える