最新の CPU は大規模なパイプライン処理を備えています。つまり、実際に命令を実行するずっと前に、必要な命令とデータをロードしています。
パイプラインにロードされたデータが無効になる場合があり、パイプラインをクリアして新しいデータを再ロードする必要があります。パイプラインの再充填にかかる時間はかなり長く、パフォーマンスが低下する可能性があります。
C で関数ポインターを呼び出した場合、パイプライン内のポインターが関数ポインターであり、次の命令のためにそのポインターに従う必要があることを認識できるほど、パイプラインはスマートですか? または、関数ポインターを使用すると、パイプラインがクリアされてパフォーマンスが低下しますか?
私は C で作業していますが、多くの関数呼び出しが v テーブルを介して行われる C++ では、これがさらに重要になると思います。
編集 @JensGustedt は次のように書いています。
関数呼び出しのパフォーマンスを実際に向上させるには、呼び出す関数を非常に短くする必要があります。コードを測定してこれを確認した場合は、その呼び出しをインライン化できるように設計を再検討する必要があります。
残念ながら、それが私が陥った罠かもしれません。
パフォーマンス上の理由から、ターゲット関数を小さく高速に記述しました。
ただし、関数ポインタによって参照されるため、他の関数に簡単に置き換えることができます (ポインタが別の関数を参照するようにするだけです!)。関数ポインタ経由で参照するので、インライン化できないと思います。
したがって、インライン化されていない非常に短い関数があります。