重複の可能性:
仮想関数とパフォーマンス - C++
私は自分のコードをリファクタリングしようとしていますが、仮想関数を使用することはパフォーマンス面で非常に難しいと人々が言うのはなぜですか? クラスを継承し、基本クラスで定義されている関数を再定義できる別の方法はありますか?
重複の可能性:
仮想関数とパフォーマンス - C++
私は自分のコードをリファクタリングしようとしていますが、仮想関数を使用することはパフォーマンス面で非常に難しいと人々が言うのはなぜですか? クラスを継承し、基本クラスで定義されている関数を再定義できる別の方法はありますか?
このトピックに関する参考記事は、http: //coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/3にあります。
怠け者の場合、答えは「少し遅いかもしれません」だと思います
仮想関数は、基本的に関数ポインターの配列であるvtableを介して呼び出されます。そのため、呼び出されるたびに、追加の配列ルックアップが行われます。これをすごいノノと呼ぶかどうかはわかりませんが、一般的にはかなり速いはずです。
ウィキペディアから:
仮想呼び出しには、コンパイル済みポインターへの単なるジャンプである非仮想呼び出しと比較して、少なくとも追加のインデックス付き逆参照が必要であり、場合によっては「フィックスアップ」の追加が必要です。したがって、仮想関数の呼び出しは、非仮想関数の呼び出しより本質的に遅くなります。1996 年に行われた実験では、実行時間の約 6 ~ 13% が正しい関数への単純なディスパッチに費やされていることが示されていますが、オーバーヘッドは 50% にもなる可能性があります [4]。仮想関数のコストは、キャッシュがはるかに大きく、分岐予測が優れているため、最新の CPU アーキテクチャではそれほど高くない場合があります。