首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >static_cast和RTTI与dynamic_cast

static_cast和RTTI与dynamic_cast
EN

Stack Overflow用户
提问于 2012-09-26 01:40:33
回答 4查看 4.5K关注 0票数 2

请遵守以下代码。据我所知,dynamic_cast比static_cast慢。因为它在运行时计算类型。我在这里怀疑的是,如果我们像下面这样使用带有typeid()的static_cast,它会花费与动态转换相同的时间吗??它会比dynamic_cast更快吗?

代码语言:javascript
复制
class Shape
{ 
public:
  virtual ~Shape(){}
};
class Circle : public Shape{ };
class Square : public Shape{ };

使用RTTI的静态转换:

代码语言:javascript
复制
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;

动态转换:

代码语言:javascript
复制
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;
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-26 02:28:39

测试类型然后执行static_cast会更快,但这些操作并不等价,因为这只允许向下转换到最派生的类型(任何中间级别都不会与typeid匹配)。我会使用dynamic_cast,因为它更健壮(例如,如果有人扩展了您的类型并传递了指针,它就不会中断)。

如果您的应用程序中存在dynamic_cast的性能问题,那么您应该重新考虑设计。虽然typeid + static_castdynamic_cast快,但不必打开对象的运行时类型比它们中的任何一个都快。

票数 7
EN

Stack Overflow用户

发布于 2012-09-26 01:56:19

这些代码示例在逻辑上并不相同。您忘记了dynamic_cast考虑了类继承,并且比较typeid()只比较继承树的部分。typeid给你的唯一的东西就是“与该对象的实际类型相关的一些唯一的标识符”。仅使用typeid()不能检查是否可以强制转换为公用基的指针,只能检查runtimetype of -与runtimetype of- whether是否完全相同。

话虽如此,我认为static_cast+typeid在一般意义上应该更快一些,但在某些情况下会给出错误的答案。

票数 3
EN

Stack Overflow用户

发布于 2012-09-26 01:50:15

我可以想象,任何优秀的编译器都能够将这两个示例优化为相同的代码。然而,找到答案的唯一方法是测量特定工具链的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12588264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档