1

だから私は何かのようなことをするとします

class Double {
  double m_double;
public:
  Double() { }
  Double(double d) : m_double(d) { }
  operator double() const { return m_double; }
  operator double&() { return m_double; }
};

たぶん、後でこれを拡張して、NaN をもう少し使いやすくする (bool say を追加することによって) などをしたいと思うかもしれません。

私の質問は、この Double (および可能な拡張機能) が、組み込みの double を直接使用するよりも「かなり」遅くなると思いますか?

大規模なデータセット、ベクトル、そのようなデータのベクトルのコピー/移動などの作業経験がある場合-経験に基づいて、このトピックに関する具体的な洞察/ポインター/ヒントを教えていただければ幸いです。

4

1 に答える 1

2

最新のコンパイラは優れた最適化を行います。クラスにエンラップされた単一のスカラーは、通常、通常のスカラーと同様に機能します。メンバー演算子に追加のチェックを追加すると、追加した分だけのコストがかかります。double に追加の制限を適用する必要がある場合は、それをお勧めします。

例: std::array<T,N>それは ... 本質的に単なる配列です。生の配列と比較したときにオーバーヘッドを示すテストを見つけることができませんでした。追加された制限とコンテナーのような機能により、価値があります。

のようなスカラーにサイレントに変換する演算子を使用しないでくださいoperator double()。コンパイラは、驚くほど簡単にタイプミスに暗黙の変換を適用し、時には欠陥コンパイルを達成します。後で、なぜそれが機能しているのかを理解するのに時間がかかります。のように変換をより明示的にしdouble raw() constます。結果のコードは理解しやすく、実行も高速です。

例: std::array<T,N>通常の配列のように最初の要素への生のポインタには変換されません。ユーザーは、&a[0]最初の要素への生のポインターを取得するために使用する必要があります。これにより、コードでの理解がはるかに安全になり、理解しやすくなります。同じように迅速に動作します (最適化されたコードでは、操作のコストは 0 です)。

于 2013-02-20T02:38:47.377 に答える