继承,组合和多个成员变量的优点/缺点

时间:2011-06-05 21:52:18

标签: c++ inheritance composition

我正在研究Ogre3D代码和WildMagic代码,我发现它们的核心类处理方式略有不同。由于我正在创建自己的核心,我想知道哪种更好的做法,并且可能在资源方面更好。

在WildMagic中,有一个Matrix类,它继承自Table类(不是多态的)。表类可以有N行和N列,并获取列和行的getter和setter。然后,Matrix类具有仅对Matrix有意义的功能,并且它可以方便地从Table继承。在这种情况下,向量也可以从Table继承(尽管WildMagic不会这样做)。 WildMagic还有一个Transform对象,用于存储Node的本地转换和派生转换。因此,Node将有两个Transform对象,其中包含必要的转换(包括位置,旋转,缩放)。

另一方面,在Ogre3D中,Matrix类不是从任何东西派生的,而Ogre3D的节点具有存储本地和派生位置的变量:Vector localPos; Vector derPos; Matrix localRot; Matrix derRot; etc.

现在请记住,这些是每帧将被使用/更新/修改数千次的核心对象,如果您在完整游戏依赖时意识到自己有性能瓶颈,则很难对其进行更改在这些核心课程上。

现在问题是:

  1. 是否存在与继承自Table类的Matrix类相关的成本与首先执行所有操作的Matrix类相关联
  2. 在Node类中有3个Transform对象实例与通过成员变量公开底层数据类型相关的成本是否相关(我意识到在两种情况下,它都是组合,只有在一种情况下,有一个{{ 1}}用于转换,而在另一种情况下,转换直接暴露。我想这个问题可以改为:wrapper
  3. 假设我正在编写一个应用程序,其中每个计算(甚至是简单的向量加法)都很重要。你会改变你的选择吗?

3 个答案:

答案 0 :(得分:2)

非常好,复杂的问题有很多很多答案。我会尽力解决这些问题,但至少在我看来,总的答案是在满足您的需求方面做的比单个人可能做的更多。

1)继承总是有成本,尽管它非常微小。这个问题确实没有一个简单的答案所以我可能会读到: http://www.hackcraft.net/cpp/templateInheritance/

2)任何必须创建或销毁的东西都需要付出代价。通常包装东西会使它们对项目中的大量人员“更安全”,但除此之外我觉得它没有用或不值得。就像继承一样,包装物品的成本非常小。

3)如果每个计算都重要,那么如果你不需要,就不要包装。至少对于简单的数学类,只需使用模板以便于使用而不是继承。

总的来说,对于矩阵和向量的基本数据结构,如果它在PC或带有任何一种方法的控制台上,你就不会杀死你的程序。缓慢的内存管理器和内存分配将比继承矢量和矩阵类更能杀死你的游戏。

答案 1 :(得分:0)

如果您没有进行虚拟函数调用,那么从纯粹的性能角度来看,这并不重要。我个人不赞成任何其他解决方案的继承。编译器将优化小包装器对象。但是,我不会完全鼓励你把OGRE3D视为优秀设计的巅峰之作 - 他们充斥着Singletons。

答案 2 :(得分:0)

对于(1),你肯定没有多态吗?在继承方面,虚函数调用是最大的效率。如果没有虚函数,那么两者之间几乎没有差别,绝对没有可以推广的差异。也许对象将在内存中以不同的方式布局在另一种情况下,也许你会有不同的大小,在一个中浪费更多的缓冲区,这类事情。

对于(2),这一切都取决于代码的优化程度。通常,如果相关函数都很容易内联,那么轻量级包装器中的实际函数调用就不会很多。但同样,对内存布局等问题可能会产生影响。它难以预测。

对于(3),我没有做出选择,所以我不知道你所指的是什么:-P