1

クラス設計についての質問です。コンパイラがこれら 2 つのクラスをどのように処理するかについて混乱しています。オブジェクト指向言語として、C++ は抽象化のファイル層または型抽象化を効率的に最適化する必要があります。私が考えることができる例はイテレータです。それらはポインターとはまったく異なるタイプですが、コンパイラーは最適化でき、たとえば for ループではポインターと同じくらい効率的です。

私が懸念しているのは、これらの 2 つのクラスが 1 つしかない場合に効率的にする方法です。2 つのクラスは、Point3 と Vector3 の数学表現です。

Point3 の操作は非常に限られていますが、数学的には、Origin から Point3 を差し引くことで Point3 から Vector3 を作成できます。Vector3 の最後を Point3 と見なすことで、反対のことを行うこともできます。

この例は、Point3 をスケーリングすることです。

Point3<float> positionStart;
Vector3<float> scale;
Point3<float> positionEnd;

positionEnd = scale * positionStart;

これにより、positionStartPoint3 が Vector3 に変換され、乗算が行われ、一時的な Vector3 の終点が に割り当てられpositionEndます。

これらの変換が実際に発生しないように、これを C++ で効率的にコーディングするにはどうすればよいでしょうか。最終的に Point3 と Vector3 は 3 つの float で表されるためです。実行時にそれが Point3 か Vector3 かを判断する必要がありますが、コンパイラはプロセッサではなく型を気にする必要があります。

これが明確であることを願っています。そうでない場合は、混乱をよりよく説明しようとします。

ありがとう

**更新**質問にもう少し焦点を当てるために、これは変換コンストラクターまたは変換で行うことができます。オペレーター。中身は実は同じ。コンパイラーは、これらのコンストラクターと変換演算子をインライン化することで、谷を見て最適化することができるでしょうか。

4

1 に答える 1

1

これを行う最も簡単な方法は、ポイント座標をベクトルとして内部に保存することです。何ができるかわからないので、セマティクスが明確な場所operator*を示します(ただし、これはテストされていないコードであることに注意してください)。operator+

template<typename Field> class Point
{
public:
  Point& operator+=(Vector<Field> const& v);
  // the rest of the Point interface
private:
  Vector<Field> position; // holds the vector from the origin to this point
};

template<typename Field>
 inline Point<Field>::operator+=(Vector<Field> const& v)
{
  position += v;
}

template<typename Field>
 inline Point<Field> operator+(Point<Field> p, Vector<Field> const& v)
{
  return p += v;
}

これで、プライベートでない場合にコンパイルされるp += v正確なコードに最適化されます。したがって、最終的にはベクトルの追加しかありません。p.position += vposition

于 2013-06-08T19:25:30.690 に答える