1

昨日、私は質問を受けました。継承とテンプレートを使用することの間のパフォーマンスのトレードオフは何ですか?

仮想関数の場合、動的リンケージは継承に関してパフォーマンスの問題を引き起こすと言いました。ただし、テンプレートを使用すると、コンパイル時に特殊クラスが生成されるため、実行可能ファイルのサイズが特殊クラスの数とともに大きくなることを除いて、パフォーマンスの問題はありません。

ここで考慮すべきことが他にあるかどうか誰かが説明できますか?

どうも!ラフル。

4

2 に答える 2

3

まず第一に、継承とテンプレートは、私の見解では、互いに直交しています(その章については、OOSCを参照してください)。C ++では、トレードオフは基本的に次のようになります。

  • 各特殊化ではコードを生成する必要があるため、テンプレートには実行可能ファイルにスペースが必要です。
  • 仮想関数の継承にはvtableが必要であり、すべての非静的メソッド呼び出しには1つの追加パラメーター(this)が必要であり、仮想関数の呼び出しにはvtableを介した間接参照があります。

つまり、スペースと速度です。しかし、同じクラスで両方の長所と短所を持つことができます(私の最初の文を参照してください-機能は到達したいものに直交しています)。

于 2012-04-14T08:34:12.997 に答える
1

仮想関数にはパフォーマンスのオーバーヘッドがあり、テンプレートのインスタンス化にはコードサイズのオーバーヘッドがあると言っているのは非常に正しいですが、どちらも軽減できます。

C ++は、使用しないものにお金を払わないことを前提に構築されていることを忘れないでください。継承されたクラスを使用すると、vtableルックアップを回避するために、いつでも共通コードを非仮想関数に移動できます。メソッドインラインは、コンパイラの最適化とうまく連携し、コードをより高速(関数呼び出しなし)およびより小さくすることができます。

テンプレートの場合と同様に、テンプレート化された型に依存しないコードは、テンプレート以外の基本クラスにプッシュアップできるため、関数のコピーは1つだけになります。

于 2012-04-14T09:35:35.257 に答える