抽象基本クラスポインタmypointer->foo()で仮想関数呼び出しfoo()があるとします。アプリが起動すると、ファイルの内容に基づいて、特定の具象クラスをインスタンス化することを選択し、そのインスタンスにmypointerを割り当てます。アプリの残りの人生の間、mypointerは常にその具体的なタイプのオブジェクトを指します。この具象型が何であるかを知る方法はありません(動的にロードされたライブラリのファクトリによってインスタンス化される可能性があります)。具象型のインスタンスが最初に作成された後、型が同じままになることを私は知っています。ポインタが常に同じオブジェクトを指しているとは限りませんが、オブジェクトは常に同じ具象型になります。タイプはファイルの内容に基づいているため、技術的には「実行時」に決定されますが、「起動」(ファイルがロードされる)後はタイプが固定されることに注意してください。
ただし、C ++では、アプリの全期間にわたってfooが呼び出されるたびに、仮想関数のルックアップコストを支払います。実行時に具象型が変化しないことを知る方法がないため、コンパイラーはルックアップを最適化できません(これまでで最も素晴らしいコンパイラーであったとしても、動的にロードされた動作を推測することはできません)ライブラリ)。Javaや.NETなどのJITコンパイル言語では、JITは同じタイプが何度も使用されていることを検出し、インラインキャッシュを実行できます。私は基本的に、C++の特定のポインターに対して手動でそれを行う方法を探しています。
このルックアップをキャッシュするC++の方法はありますか?私は、解決策がかなりハックなものかもしれないことを理解しています。ABI /コンパイラの関連する側面を検出する構成テストを記述して、実際に移植可能でなくても「実質的に移植可能」であるようにすることができれば、ABI/コンパイラ固有のハックを受け入れるつもりです。
更新:否定論者へ:これが最適化する価値がなかったとしたら、現代のJITがそれを行うとは思えません。SunとMSのエンジニアは、インラインキャッシュの実装に時間を浪費しており、改善があったことを確認するためにベンチマークを行っていなかったと思いますか?