O meu método para evitar dynamic_cast <> é mais rápido que o dynamic_cast <>?

Eu estava respondendo aPergunta, questão alguns minutos atrás e me trouxe outro:

Em um dos meus projetos, faço uma análise de mensagens de rede. As mensagens estão na forma de:

[1 byte message type][2 bytes payload length][x bytes payload]

O formato e o conteúdo da carga útil são determinados pelo tipo de mensagem. Eu tenho uma hierarquia de classes, com base em uma classe comumMessage.

Para instanciar minhas mensagens, eu tenho um método de análise estática que devolve umMessage* dependendo dobyte do tipo de mensagem. Algo como:

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.
}

Às vezes, preciso acessar os métodos das subclasses. Desde o meu tratamento de mensagens na rededevo seja rápido, eu decidi evitardynamic_cast<> e adicionei um método à baseMessage classe que devolve o tipo de mensagem. Dependendo desse valor de retorno, eu uso umstatic_cast<> para o tipo filho certo.

Eu fiz isso principalmente porque me disseram uma vez quedynamic_cast<> foi lento. No entanto, eu não sei exatamenteo que realmente faz e quão lento é, portanto, meu método pode ser tão lento (ou mais lento), mas muito mais complicado.

O que vocês acham desse design? Isso é comum? É realmente mais rápido do que usardynamic_cast<> ? Qualquer explicação detalhada do que acontece quando alguém usadynamic_cast<> é bem vindo!

--- EDIT ---

Como algumas pessoas perguntaram o porquê:

Basicamente, quando recebo um quadro, faço duas coisas:

Analiso a mensagem e construo uma instância correspondente de uma subclasse deMessage se o conteúdo do quadro for válido. Há simnão lógica, exceto para a parte de análise.Eu recebo umMessage e dependendo de umswitch(message->getType()), EUstatic_cast<> para o tipo certo e faça o que for necessário com a mensagem.

questionAnswers(9)

yourAnswerToTheQuestion