这是关于班级设计的问题。我很困惑编译器将如何处理这两个类。 作为面向对象的语言,C ++需要优化le层抽象或类型抽象才能高效。我能想到的一个例子是迭代器。它们是完全不同于指针的类型,但编译器可以优化,例如在for循环中,它与指针一样高效。
我关心的是如果这两个类只有一个,那么如何使这两个类有效。这两个类是Point3和Vector3的数学表示。
Point3上的操作确实有限,但在数学上我们可以通过从Origin中减去它来从Point3中创建一个Vector3。我们也可以通过将Vector3的结尾视为Point3来做对位。
这样做的一个例子是缩放Point3。
Point3<float> positionStart;
Vector3<float> scale;
Point3<float> positionEnd;
positionEnd = scale * positionStart;
这应该将positionStart
Point3转换为Vector3,进行乘法,然后取临时Vector3的终点,将其分配给positionEnd
。
我们如何在C ++中有效地编码,以便实际上不会发生这些转换。因为最终Point3和Vector3由3个浮点数表示。在运行时,如果它是Point3或Vector3,它应该是mather,但编译器应该关心的类型而不是处理器。
我希望这很清楚,如果没有,我会试着更好地解释我的困惑。
感谢
**更新** 为了更多地关注问题,可以使用转换构造函数或转换来完成。运营商。内部实际上是相同的。编译器是否能够看到低谷并优化出来,我想通过内联,那些构造函数和转换运算符。
答案 0 :(得分:1)
最简单的方法是将点坐标作为向量存储在内部。由于我不知道operator*
会做什么,我会用operator+
显示,其中sematics是明确的(请注意,这是未经测试的代码):
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
编译到的确切代码进行优化。所以最终你只有一个向量添加。