1

这是一个关于类设计的问题。我对编译器将如何处理这两个类感到困惑。作为面向对象的语言,C++ 需要优化文件抽象层或类型抽象以提高效率。我能想到的一个例子是迭代器。它们是与指针完全不同的类型,但编译器可以优化,例如在 for 循环中与指针一样有效。

我关心的是如果这两个类只有一个,如何让它们变得高效。这两个类是 Point3 和 Vector3 的数学表示。

Point3 上的操作非常有限,但在数学上,我们可以通过从 Origin 中减去 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 个浮点数表示。在运行时,它应该是 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 += v将编译到的确切代码。position所以最终你只有一个向量加法。

于 2013-06-08T19:25:30.690 回答