繁体   English   中英

类型之间的转换

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM