多态类、虚函数和性能强制转换

C++ A polymorphic class, virtual function and casting for performance

本文关键字:性能 转换 函数 多态      更新时间:2023-10-16

我有以下类:

class State
{
  protected:
    Vec3D accel;
    Vec3D gyro;
    Vec3D gps;
    float reward;
  public:
    boost::ptr_vector<Action> actions;
    ...
    virtual bool isTerm();
}
class guState : public State
{  
    float gps_stand_thres;
    float gps_down_thres;
  public:
    guState(Agent &A,ACTION_MODE &m);
    bool isTerm();
};

还有其他类都继承自State。它们的区别仅仅在于它们如何计算isTerm(),这取决于行为。我宁愿不使用虚函数而重写函数isTerm,如果不是因为有一些其他模板类被设计成与各种状态派生类一起工作。其中之一是Policy:

template <class S>
class Policy
{ 
  protected:    
    float QValue;
    S *state;
    S *nextState;
  public:
    ...
    template <class P>
    void updateOptimal(boost::ptr_vector<P> &policies);
}

updateOptimal必须获得一个State派生类(取决于行为),从State *ptr向上转换为当前使用的任何s类型,以便搜索该状态的策略。现在,因为状态派生类是多态的,所以我认为这样做是正确的:

S *s = dynamic_cast<S *>(iter->getNextState());

, iter是action的迭代器,每个action都有一个指向State *nextstate;的指针Action ->nextstate在其他位置设置:

action->setNextState(dynamic_cast<State *>(state)); 

我可以模板整个类Action,为了避免使用State *nextstate;而使用S *nextstate;,但这将需要在整个项目中进行大量更改。

阅读cplusplus.com上的转换教程,我的理解是最好使用dynamic_cast,因为它在向上或向下转换之前进行类型检查。但是,在转换之后的以下代码中,除了将其用于搜索之外,我没有对向上转换的状态做任何操作:

P *temp_pol = var::findPolicy(policies,s);

where findPolicy is:

template <class P, class S>
P* findPolicy(boost::ptr_vector<P> &policies,S *state);
  • 可以跳过安全检查,使用静态强制类型转换吗?我我试过了,可以编译了。
  • 是否可以完全跳过检查,并进行reinterpret_cast ?我也试过了,可以编译。
  • 做dynamic_cast的惩罚是什么?我知道有一个小
  • 是否有一种方法可以从State *ptr上转换为S-type *ptr而不使用多态类(避免虚函数和简单的覆盖它)?

static_castdynamic_cast之间的区别是无效的static_cast是未定义的行为,而无效的dynamic_cast导致空指针或bad_cast异常(如果您强制转换引用)。dynamic_cast的代价是在运行时进行类型检查,并且由于RTTI增加了代码大小。

因此,如果您确信强制转换总是很好,则可以安全地使用static_cast。与static_cast相比,使用reinterpret_cast不会给您带来任何性能改进,因此您不应该在这里使用它。