数分前に質問に答えていたところ、別の質問が浮かびました。
私のプロジェクトの 1 つで、ネットワーク メッセージの解析を行っています。メッセージの形式は次のとおりです。
[1 byte message type][2 bytes payload length][x bytes payload]
ペイロードの形式と内容は、メッセージ タイプによって決まります。共通の class に基づくクラス階層がありますMessage
。
Message*
メッセージをインスタンス化するために、メッセージの種類に応じてbyteを返す静的解析メソッドがあります。何かのようなもの:
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.
}
サブクラスのメソッドにアクセスする必要がある場合があります。私のネットワーク メッセージ処理は高速でなければならないので、回避することに決め、メッセージ タイプを返すdynamic_cast<>
基本クラスにメソッドを追加しました。Message
この戻り値に応じて、static_cast<>
代わりに右の子型に a を使用します。
私がこれを行った主な理由は、これdynamic_cast<>
は遅いと言われたことがあるからです。ただし、それが実際に何をするのか、どのくらい遅いのかは正確にはわかりません。したがって、私の方法は同じくらい遅い (または遅い) かもしれませんが、はるかに複雑です。
このデザインどう思いますか?それは一般的ですか?を使用するよりも本当に速いdynamic_cast<>
ですか?1回の使用で内部で何が起こるかについての詳細な説明dynamic_cast<>
は大歓迎です!
- - 編集 - -
一部の人々が理由を尋ねたので:
基本的に、フレームを受信すると、次の 2 つのことを行います。
Message
メッセージを解析し、フレームのコンテンツが有効である場合、対応するサブクラスのインスタンスを構築します。解析部分以外にロジックはありません。- 私は を受け取り、に
Message
応じて適切なタイプに移動し、メッセージに対して必要な処理を行います。switch(message->getType())
static_cast<>