2012-04-14 11 views
1

昨日、相続とテンプレートを使用する際のパフォーマンスのトレードオフは何ですか?C++:継承とテンプレートのパフォーマンスのトレードオフ

私はそれを継承するために来るとき仮想関数の場合には、ダイナミックリンクは、いくつかのパフォーマンスの問題が発生しますと述べました。ただし、テンプレートでは、コンパイル時に特殊クラスが生成されるため、実行可能ファイルのサイズが特殊クラスの数とともに増加することを除けば、パフォーマンスに問題はありません。

ここで他に考慮すべきことがあれば誰でも説明できますか?

Thx!ラフール 。

+2

知らん動的ライブラリ対静的の文脈の外で使用される「ダイナミックリンク」を行う仮想何の機能のための通常の用語です...もちろん、私は言葉を聞いたことがない「連携」の場合とオブジェクトファイル、そうえっ... – cHao

+5

私はあなたが正しい@amit – amit

+0

を記述しているものを正しく理解すれば、「ダイナミックリンク」の正しい用語は、結合動的または[ダイナミックディスパッチ](http://en.wikipedia.org/wiki/Dynamic_dispatch)です - あなたは、ここで用語を確認することができます:http://www.parashift.com/c++-faq-lite/virtual-functions.html –

答えて

3

最初に - 継承&私の視点では、テンプレートはお互いに直交しています(その章についてはOOSCを参照してください)。 C++でのトレードオフは、基本的に煮詰める:各専門 を生成するためのコードを必要とするので

  • テンプレートは、実行中のスペースを必要とします。仮想関数と
  • 継承のvtableを必要とする、すべての非静的メソッド呼び出しは、一つの追加のパラメータ(本)を必要とし、仮想関数の呼び出しは、仮想テーブルを介して間接に有します。

だから、スピード対スペースです。しかし、あなたは同じクラスの両方の利点を得ることができます(私の最初の文章を見てください - 機能は彼らが到達したいと思っているところで直交しています)。

+0

はいです。それは私がその男に言ったこととほとんど同じです。彼はあまり感心していませんでした。それは、私たちがテンプレートについて話すときにパフォーマンスのことがわかるかどうかを知りたかった理由です。 – rahul

1

あなたは仮想関数は、パフォーマンスのオーバーヘッドを持つことができ、テンプレートのインスタンスはコードサイズのオーバーヘッドを持っていることを言ってはかなり正確であるが、両方を軽減することができます。

私はC++があなたが使っていないものを支払っていないことを前提にしていることを思い出さなければならないので、継承されたクラスでは、vtable参照を避けるために、時にはインラインでメソッドを作ることは、コンパイラの最適化でうまくいくことができ、コードをより速く(関数呼び出しなし)より小さくすることができます。

同様テンプレートと、テンプレートの種類に依存しない任意のコードは、非テンプレートベースクラスに押し上げることができ、したがって、機能のみのコピーが存在することになります。