我的方法是避免dynamic_cast <>比dynamic_cast <>更快吗?

ere*_*eOn 7 c++ polymorphism dynamic-cast static-cast

几分钟前我正在回答一个问题,它又向我提出了另一个问题:

在我的一个项目中,我做了一些网络消息解析.消息的形式为:

[1 byte message type][2 bytes payload length][x bytes payload]
Run Code Online (Sandbox Code Playgroud)

有效负载的格式和内容由消息类型确定.我有一个基于公共类的类层次结构Message.

为了实例化我的消息,我有一个静态解析方法,它Message*根据消息类型字节返回一个.就像是:

Message* parse(const char* frame)
{
  // This is sample code, in real life I obviously check that the buffer
  // is not NULL, and the size, and so on.

  switch(frame[0])
  {
    case 0x01:
      return new FooMessage();
    case 0x02:
      return new BarMessage();
  }

  // Throw an exception here because the mesage type is unknown.
}
Run Code Online (Sandbox Code Playgroud)

我有时需要访问子类的方法.由于我的网络消息处理必须快速,我决定避免,dynamic_cast<>并且我向基Message类添加了一个方法,它返回消息类型.根据此返回值,我使用a static_cast<>到正确的子类型.

我这样做主要是因为我被告知一旦这dynamic_cast<>很慢.但是,我不确切地知道它到底什么的,它有多慢,因此,我的方法可能同样慢(或慢)但更复杂.

你们对这个设计有什么看法?这很常见吗?它真的比使用更快dynamic_cast<>吗?任何使用dynamic_cast<>欢迎时引擎盖下发生的事情的详细解释!

---编辑---

有些人问为什么:

基本上,当我收到一个框架时,我会做两件事:

  1. 我解析消息并构建一个子类的相应实例,Message如果帧的内容是有效的.有没有除了解析部分的逻辑.
  2. 我收到了一个Message并依赖于switch(message->getType())我,我static_cast<>是正确的类型,并做了一些必须完成的消息.

Ter*_*fey 7

dynamic_cast的实现当然会因编译器而异.

在Visual C++中,vtable指向包含有关结构的所有RTTI的结构.因此,dynamic_cast涉及解除引用此指针,并根据请求的类型检查"实际"类型,并在它们不兼容时抛出异常(或返回NULL).它基本上等同于您描述的系统.这不是特别慢.

你的设计听起来有点不对 - 你有一个工厂方法忘记了对象的真实类型,然后你立即想要忘记那些信息.也许你应该在将类型遗忘到工厂方法时或者在基类本身的虚拟方法中移动你所做的逻辑.