请遵守以下代码。据我所知,dynamic_cast比static_cast慢。因为它在运行时计算类型。我在这里怀疑的是,如果我们像下面这样使用带有typeid()的static_cast,它会花费与动态转换相同的时间吗??它会比dynamic_cast更快吗?
class Shape
{
public:
virtual ~Shape(){}
};
class Circle : public Shape{ };
class Square : public Shape{ };使用RTTI的静态转换:
Circle c;
Shape* s = &c; // Upcast: normal and OK
// More explicit but unnecessary:
s = static_cast<Shape*>(&c);
// (Since upcasting is such a safe and common
// operation, the cast becomes cluttering)
Circle* cp = 0;
Square* sp = 0;
// Static Navigation of class hierarchies
// requires extra type information:
if(typeid(s) == typeid(cp)) // C++ RTTI
cp = static_cast<Circle*>(s);
if(typeid(s) == typeid(sp))
sp = static_cast<Square*>(s);
if(cp != 0)
cout << "It's a circle!" << endl;
if(sp != 0)
cout << "It's a square!" << endl;动态转换:
Circle c;
Shape* s = &c; // Upcast: normal and OK
s = &c;
Circle* cp = 0;
Square* sp = 0;
cp = dynamic_cast<Circle*>(s);
if(cp != 0)
cout << "It's a circle!" << endl;
sp = dynamic_cast<Square*>(s);
if(sp != 0)
cout << "It's a square!" << endl;发布于 2012-09-26 02:28:39
测试类型然后执行static_cast会更快,但这些操作并不等价,因为这只允许向下转换到最派生的类型(任何中间级别都不会与typeid匹配)。我会使用dynamic_cast,因为它更健壮(例如,如果有人扩展了您的类型并传递了指针,它就不会中断)。
如果您的应用程序中存在dynamic_cast的性能问题,那么您应该重新考虑设计。虽然typeid + static_cast比dynamic_cast快,但不必打开对象的运行时类型比它们中的任何一个都快。
发布于 2012-09-26 01:56:19
这些代码示例在逻辑上并不相同。您忘记了dynamic_cast考虑了类继承,并且比较typeid()只比较继承树的叶部分。typeid给你的唯一的东西就是“与该对象的实际类型相关的一些唯一的标识符”。仅使用typeid()不能检查是否可以强制转换为公用基的指针,只能检查runtimetype of -与runtimetype of- whether是否完全相同。
话虽如此,我认为static_cast+typeid在一般意义上应该更快一些,但在某些情况下会给出错误的答案。
发布于 2012-09-26 01:50:15
我可以想象,任何优秀的编译器都能够将这两个示例优化为相同的代码。然而,找到答案的唯一方法是测量特定工具链的结果。
https://stackoverflow.com/questions/12588264
复制相似问题