这是一道关于类设计的题。我对编译器将如何处理这两个类感到困惑。 作为一种面向对象的语言,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个float来表示的。在运行时,它应该判断它是 Point3 还是 Vector3,但编译器应该关心类型而不是处理器。
我希望这是清楚的,如果没有,我会尝试更好地解释我的困惑。
谢谢
** 更新 ** 为了更加关注问题,这可以通过转换构造函数或转换来完成。运营商。内部其实是一样的。编译器是否能够看到槽并优化掉,我想通过内联,那些构造函数和转换运算符。
最佳答案
执行此操作的最简单方法是将点坐标作为 vector 在内部存储。因为我不知道 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
不是私有(private)的。所以最终你只有一个 vector 加法。
关于c++ - 类型之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17002821/