static_cast和RTTI vs dynamic_cast

ran*_*111 2 c++ dynamic-cast static-cast

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

class Shape
{ 
public:
  virtual ~Shape(){}
};
class Circle : public Shape{ };
class Square : public Shape{ };
Run Code Online (Sandbox Code Playgroud)

使用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;
Run Code Online (Sandbox Code Playgroud)

动态演员:

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;
Run Code Online (Sandbox Code Playgroud)

Dav*_*eas 7

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

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