さまざまなコンパイラがGCC(これは線形ではありません)の横にどのような実装を使用しているのか分かりません。しかし、紙が必ずしもすべての(または共通の)使用のための既存の実装より常に速い方法を提案するとは限らないことを強調することが重要です。継承階層が成長するにつれて漸近的に優れた一般的な解を提案する。
しかし、大きな継承階層を持つことは、アプリケーションをモノリシックにして柔軟に変更できなくなる傾向があります。柔軟な設計のプログラムは、主に2つのレベルの階層、抽象的な基盤、およびオープン/クローズド・プリンシプルをサポートする実行時ポリモーフィック・ロールの実装のみを持つ傾向があります。これらのケースでは、継承グラフを歩くことは、単一のポインタ逆参照および比較と同じくらい簡単であり、GibbsおよびStroustrupによって提示された索引 - 合計 - 逆参照 - 比較よりも速くなり得る。
また、独自のビジネスルールが必要としない限り、dynamic_castを使用するプログラムを作成するには、決してが必要であることを強調することが重要です。 dynamic_castの使用は、常に多型が適切に使用されておらず、再利用が危険にさらされていることを示しています。階層をキャストすることに基づいた動作が必要な場合は、仮想メソッドを追加するとクリーンなソリューションが得られます。タイプのdynamic_cast-checkを行うコードセクションがある場合、そのコードセクションは決して(オープン/クローズドプリンシプルの意味で)「閉じる」ことはなく、システムに追加されるすべての新しいタイプに対して更新する必要があります。一方、仮想ディスパッチは、新しいタイプでのみ追加され、展開を開いたままにして、基本タイプで動作するビヘイビアを閉じることができます。
これは実際には良い設計に従えば実際の世界の効果を持たないはずの学問的な提案です(マップをアルゴリズム的にhash_mapに変更することに相当します)。ビジネスルールが良い設計を禁じている場合(既存のアーキテクチャを変更したり、サードパーティのライブラリで一般的に使用されるようにアダプタを構築することができないコード障壁やコード所有権の問題があるショップもあります)どのアルゴリズムが実装されているかに基づいて、使用するコンパイラを決めるのは最善ではありません。常にパフォーマンスが重要で、dynamic_castなどの機能を使用する必要がある場合は、コードをプロファイルします。ツリーウォーキングの実装は実際にはより高速である可能性があります(多くの場合そうかもしれません)。
the standards committee's review of implementations, including dynamic_castおよびa well-known look at c++ in embedded environments and good use (which mentions Gibbs and Stroustrup in passing)も参照してください。
コンパイラがそれを使用しているかどうかはわかりませんが、ライブラリベースのRTTIソリューションをいくつか使用しています。 –
「タイプID」の「割り当て」はリンク時に行われるため(ペーパーを参照)、ライブラリはどのようにそれを達成できますか?例がありますか? –
全く同じではありません。 IDは他の方法で割り当てられますが、有効なキャストを決定するためにはモジュロを使用します。 –