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.