多态类、虚函数和性能强制转换
C++ A polymorphic class, virtual function and casting for performance
我有以下类:
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_cast
和dynamic_cast
之间的区别是无效的static_cast
是未定义的行为,而无效的dynamic_cast
导致空指针或bad_cast
异常(如果您强制转换引用)。dynamic_cast
的代价是在运行时进行类型检查,并且由于RTTI增加了代码大小。
因此,如果您确信强制转换总是很好,则可以安全地使用static_cast
。与static_cast
相比,使用reinterpret_cast
不会给您带来任何性能改进,因此您不应该在这里使用它。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- 隐式转换函数的返回对象时是否会影响性能?
- isspace 函数的性能警告,从 int 转换为布尔值
- 加快 R 性能或将 R 函数转换为C++函数
- 浮点转换和性能
- 将特征矩阵转换为 c 数组以便我可以使用 gsl 的性能高效方法是什么
- 枚举静态转换为布尔,编译器发出性能警告
- 可以安全地使用静态强制转换,为每个实例使用唯一的虚拟 int type() 来提高性能
- 将所有双精度转换为整数以获得更好的性能,这只是一个谣言
- 字符串到flywweights的字符串转换:更好的性能选项
- 将std::string转换为大写:主要性能差异
- Lambda到std::函数的转换性能
- 使用marshal_as函数转换字符串的性能
- 转换c++映射到C数组-性能
- 多态类、虚函数和性能强制转换