[英]Conversion between types
这是关于班级设计的问题。 我对编译器如何处理这两个类感到困惑。 作为一种面向对象的语言,C ++需要优化抽象层或类型抽象层以提高效率。 我可以考虑的一个示例是迭代器。 它们是与指针完全不同的类型,但是编译器可以进行优化,例如在for循环中,其效率与指针相同。
我担心的是,如果这两个类只有一个,那么如何使它们效率更高。 这两个类是Point3和Vector3的数学表示。
Point3上的运算确实很有限,但是在数学上,我们可以通过从Origin减去Point3来从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,但编译器应该关心类型而不是处理器。
我希望这很清楚,如果没有,我会尽力解释我的困惑。
谢谢
**更新**为了更加关注问题,可以使用转换构造函数或转换来完成。 运营商。 内部实际上是相同的。 我猜通过内联,这些构造函数和转换运算符将使编译器能够看到低谷并进行优化。
最简单的方法是将点坐标作为矢量存储在内部。 由于我不知道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
不是私有的将被编译为的确切代码。 因此,最终您只有一个向量加法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.