昨日、私は質問を受けました。継承とテンプレートを使用することの間のパフォーマンスのトレードオフは何ですか?
仮想関数の場合、動的リンケージは継承に関してパフォーマンスの問題を引き起こすと言いました。ただし、テンプレートを使用すると、コンパイル時に特殊クラスが生成されるため、実行可能ファイルのサイズが特殊クラスの数とともに大きくなることを除いて、パフォーマンスの問題はありません。
ここで考慮すべきことが他にあるかどうか誰かが説明できますか?
どうも!ラフル。
昨日、私は質問を受けました。継承とテンプレートを使用することの間のパフォーマンスのトレードオフは何ですか?
仮想関数の場合、動的リンケージは継承に関してパフォーマンスの問題を引き起こすと言いました。ただし、テンプレートを使用すると、コンパイル時に特殊クラスが生成されるため、実行可能ファイルのサイズが特殊クラスの数とともに大きくなることを除いて、パフォーマンスの問題はありません。
ここで考慮すべきことが他にあるかどうか誰かが説明できますか?
どうも!ラフル。
まず第一に、継承とテンプレートは、私の見解では、互いに直交しています(その章については、OOSCを参照してください)。C ++では、トレードオフは基本的に次のようになります。
つまり、スペースと速度です。しかし、同じクラスで両方の長所と短所を持つことができます(私の最初の文を参照してください-機能は到達したいものに直交しています)。
仮想関数にはパフォーマンスのオーバーヘッドがあり、テンプレートのインスタンス化にはコードサイズのオーバーヘッドがあると言っているのは非常に正しいですが、どちらも軽減できます。
C ++は、使用しないものにお金を払わないことを前提に構築されていることを忘れないでください。継承されたクラスを使用すると、vtableルックアップを回避するために、いつでも共通コードを非仮想関数に移動できます。メソッドインラインは、コンパイラの最適化とうまく連携し、コードをより高速(関数呼び出しなし)およびより小さくすることができます。
テンプレートの場合と同様に、テンプレート化された型に依存しないコードは、テンプレート以外の基本クラスにプッシュアップできるため、関数のコピーは1つだけになります。