2

些細な解決策は次のとおりです。

class Number
{
public: 
    bool isFinite();
    bool isPositive();
    double value();

    ...

private:
    double value_;
    bool isFinite_;
    bool isPositive_;

    ...
};

私が心配しているのは効率です。

効果的な C++ から: プログラムと設計を改善するための 55 の具体的な方法 (第 3 版)、Scott Meyers 著:

小さなオブジェクトに安価なコピー コンストラクターがある場合でも、パフォーマンスの問題が発生する可能性があります。一部のコンパイラでは、組み込み型とユーザー定義型の扱いが異なります。基になる表現が同じであってもです。たとえば、一部のコンパイラは、定期的に裸の double を喜んで配置しているにもかかわらず、double のみで構成されるオブジェクトをレジスタに配置することを拒否します。そのようなことが起こった場合、コンパイラは確実にポインター (参照の実装) をレジスターに入れるため、そのようなオブジェクトを参照によって渡す方がよい場合があります。

効率の問題を回避する方法はありますか? たとえば、アセンブリ言語の魔法を使用するライブラリは?

4

2 に答える 2

6

double に対して Number クラスを実装する理由はほとんどありません。double 形式は、生の基本的な double 型の一部として、Infinity、NaN、および表記を既に実装しています。

次に、最初に正確さを目指してコードを記述し、後で最適化を試みる必要があります。その時点で、特定のデータ構造を調べ、コードとアルゴリズムを書き直すことができます。

現代のコンパイラは通常、優れたコードを非常に効率的に記述でき、通常、ほとんどの人間のプログラマよりもはるかに優れた仕事をします。

于 2012-05-16T04:28:09.110 に答える
2

あなたの特定の例では、クラスではなく double をそのまま使用します。それらは、無限を処理するために適切に適合され、定義されています。

より一般的な意味では、単純な解決策を使用し、問題が発生した場合 (または、発生する可能性が高い場合) にのみパフォーマンスを心配する必要があります。

つまり、コードを作成し、使用する多くのシナリオでテストします。

それでもパフォーマンス要件の範囲内で実行される場合は、最適化を試みる必要はありません。そして、「できるだけ速く実行したい」という、もう少し具体的なパフォーマンス要件が必要です:-)

効率性とは、「コストに関係なく、できるだけ速く」という意味ではないことに注意してください。これは、他のこと (読みやすさや保守性など) を必ずしも犠牲にすることなく、目標を達成することを意味します。

ユーザーを 0.1 秒待たせる完全な操作を行い、それを 10 倍速くなるように最適化すると、ユーザーはまったく気付かないでしょう (「完了」と言うのは、明らかに、ユーザー次の場合に違いに気付くからです)。なんらかの中間結果なしで 1 万回実行されました)。

そして覚えておいてください、測定してください、推測しないでください!

于 2012-05-16T04:30:51.307 に答える