繁体   English   中英

static_cast和RTTI vs dynamic_cast

[英]static_cast and RTTI vs dynamic_cast

请遵守以下代码。 据我所知,dynamic_cast比static_cast慢。 因为它在运行时评估类型。 我在这里的疑问是,如果我们将static_cast与typeid()一起使用如下,它是否需要与动态强制转换相同的时间? 它会比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;

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

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

这些代码示例在逻辑上不相同。 您忘记了dynamic_cast将类继承带入帐户,并且比较typeid()仅比较继承树的部分。 typeid给你的唯一东西是“与该对象的实际类型相关的一些唯一标识符”。 仅使用typeid(),您无法检查是否可以转换为公共库的指针,只能检查其运行时类型是否与运行时类型完全相同。

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

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

只有一种方法可以肯定。 用std :: chrono和high_resolution_clock测量它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM