私は最近多くの読書をしており、継承 (および仮想関数) をカバーしているときに、「インライン」キーワードに出くわし続けています。これで、通常の意味でのインラインが何であるかがわかりました。コンパイラーは、関数呼び出しを正確なコードに置き換える場合があります。ただし、継承に関して言及されているのを見た回数-継承内でインラインを使用する特別な理由はありますか? なぜそれが言及され続けるのか理解できません....
インライン関数には、継承/派生クラス/仮想関数内でどのような追加の役割がありますか?
私は最近多くの読書をしており、継承 (および仮想関数) をカバーしているときに、「インライン」キーワードに出くわし続けています。これで、通常の意味でのインラインが何であるかがわかりました。コンパイラーは、関数呼び出しを正確なコードに置き換える場合があります。ただし、継承に関して言及されているのを見た回数-継承内でインラインを使用する特別な理由はありますか? なぜそれが言及され続けるのか理解できません....
インライン関数には、継承/派生クラス/仮想関数内でどのような追加の役割がありますか?
はい、仮想関数でインラインを使用するのは時間の無駄です。仮想関数は、関数ポインターで構成される仮想関数テーブルを介して呼び出す必要があります。インライン関数は、ポインターによって呼び出すことはできません。実関数として存在する必要があります。
いくつかの例外があります。呼び出し元が正確なオブジェクト型を知っている場合、仮想関数テーブルを完全にスキップできます。
virtual キーワードを使いすぎると、コードが非常に遅くなる可能性があります。コンパイラが 3 つまたは 4 つの小さな関数呼び出しをインライン化して最適化できる場合、仮想関数では実際の関数呼び出しを実行する必要があり、呼び出し間のメモリまたはレジスタの状態に関する仮定は行われません。