2012-04-19 15 views
0

可能性の重複:
Virtual functions and performance - C++仮想関数が非常に遅いのはなぜですか? C++

私は自分のコードをリファクタリングしようとしている、そして世界中の人々は、仮想関数を使用すると、なぜ、huuuuge NONOの性能面であることを言うの?私はクラスを継承し、基本クラスで定義されている関数を再定義する別の方法がありますか?

+0

ですね? –

+0

実際にパフォーマンスに問題がありますか? –

答えて

1

仮想関数は、基本的には関数ポインタの配列であるvtableで呼び出されます。したがって、呼び出されるたびに、追加の配列検索が行われます。私はこれをhuuuugeノーと呼ぶかどうかは分かりませんが、一般的にはかなり速いはずです。ウィキペディアから

仮想呼び出しは単に へのジャンプである非仮想呼び出し、と比較して、少なくとも余分なインデックス付き間接参照を必要とし、 時には「に修復し、」追加コンパイルインポインタ。したがって、virtual 関数の呼び出しは、非仮想関数を呼び出すよりも本質的に遅いです。 1996年に行われた の実験では、 実行時間の約6-13%が、正確な関数 にディスパッチするだけで済み、オーバーヘッドは50%にも達する可能性が高いことが示されています。仮想 の機能のコストは、多くのキャッシュとより良い分岐予測のために、最新のCPUアーキテクチャではそれほど高くないかもしれません。

+0

これは実装が定義していますが、ほとんどの実装はそうしています。 –

+0

私はまた、コンパイラが1996年以来長い道のりを歩んできたと思います:) –