3

この件に関する投稿がかなりあることは承知していますが、この正確な質問に対する答えを見つけるのに苦労しています.

関数呼び出しの場合、純粋仮想インターフェイスと pimpl のどちらが高速ですか?

一見すると、pimpl を使用すると 1 回ではなく 2 回の関数呼び出しが必要になるため、純粋仮想インターフェイスの方が高速であるように思えます...または、この場合、ある種の巧妙なコンパイラのトリックが引き継がれるのでしょうか?

編集: これらのどれを使用して、非常に頻繁に大量に生成する必要があるいくつかのオブジェクトのシステム依存部分を抽象化するかを決定しようとしています。

編集:
この時点で言う価値があると思いますが、私の問題の根本は、特定のインターフェイスの実装を切り替えることが本当の目的である場合に、複数のプラットフォームでコードを機能させる方法として、Abstract Factory の設計パターンを間違えたことです。実行時に

4

2 に答える 2

5

2つのオプションは同等ではありません。焦点が異なるため、パフォーマンスを比較しないでください。それらが同等であったとしても、ほとんどの状況でパフォーマンスの違いは最小限から重要ではありません。ディスパッチが問題になっていることがまれにわかっている場合は、違いを自分で測定するためのツールがあります。

于 2012-04-30T02:29:33.763 に答える
1

なぜ聞くのですか?質問は意味がないようです。

一般に、ポリモーフィズムが必要な場合、つまり派生クラスでそれらをオーバーライドしたい場合に、仮想関数を使用します。

ヘッダーファイルから実装の詳細を削除したい場合は、一般に pimpl を使用します。

この 2 つは実際には交換できません。私の頭の中で、一方を使用して他方に置き換えることを検討する合理的な状況は考えられません。


とにかく、仮想関数の典型的な実装では、関数呼び出しには、オブジェクトを読み取って仮想関数テーブルポインターを見つけ、次に仮想関数テーブルを読み取って関数ポインターを見つけ、最後に関数ポインターを呼び出すことが含まれます。

pimpl を介して実装されたクラスの場合、1 つの関数呼び出しが強制されますが、それは「ボンネットの下」にあるものなら何でもかまいません。あなたが提案したことにもかかわらず、パラダイムによって2番目の関数呼び出しが暗示されることはありません。


最後に、最適化のための通常のガイドラインが適用されることを忘れないでください。実際に実装して測定する必要があります。答えを「考え」ようとすると、この種の経験者であっても、悪い結果につながる傾向があります。

そしてもちろん、最適化の最も重要なルールは、最適化に多くの時間を費やす前に、何かが重要であることを確認することです。そうしないと、多くの時間とエネルギーを浪費することになります。

于 2012-04-30T02:38:48.050 に答える