多态调用的成本 - C++

Jos*_*ain 8 c++ polymorphism

我正在用C++编写一个游戏,它有大约30个不同的角色,每个角色都略有不同.我有一个主类User,其中包含所有角色所需的所有数据.我的第一个实现只涉及30个角色的枚举和适当处理,但现在我想知道将User作为基类并且每个角色都是自己继承自User的类是否更好.

我主要担心的是,当有30多个类继承自单个基类时,多态方法调用的效率如何?我知道多态调用涉及虚拟表中的指针,但我不确定这是否意味着对整个表进行线性搜索以获得正确的方法,或者是否可以在恒定时间内完成.

如果有人可以用多个继承的类来评论多态方法调用的效率,我会很感激启发.

提前致谢!

Kei*_*las 7

而不是使用继承,使用组合.只需为"用户"类提供一个扮演角色的对象即可.所以你最终可能会有30个"角色"课程.但是他们没有继承'User',而是被赋予'User'使用(他们可以继承他们自己的基本抽象类来定义'Role'的接口)

或者如果它只是一个函数....你可能只是将它建模为一堆函数对象,然后将它们传递给User.


Luc*_*ore 6

费用是可以忽略的.无论你有多少类,或者有多少级别的继承,多态调用的成本都是一个简单的加法 - 指向vftable加上特定函数的偏移量的指针(不是标准强制的,但在大多数情况下,如果并非所有,实现这是正确的).

  • @lukas您总能找到自己的测试用例来证明您的观点.如果你想证明虚拟调度是昂贵的,你只需要创建两种类型,并且只需要一个不做任何事情的虚函数(比如返回在派生类型中存储为数据成员的int).在紧密循环中调用它,您将看到虚拟调度与函数的其余部分一样昂贵(可能更多).问题是,当你需要它时,它与替代品相比如何?在真实场景中(功能执行某些工作)需要多少费用...... (2认同)