2012-03-08 6 views
1

クラスを拡張するとき、パフォーマンスに多型とコンポジションの間に違いがありますか?クラスを拡張するときのパフォーマンスコンポジション対多型

class Window 
{ 
    public: 
     Window(Renderer &renderer) : m_renderer(renderer) 
     { } 

     void update() 
     { 
      .... 
      m_renderer.draw(this); 
     } 
    private: 
     Renderer &m_renderer; 
} 

...とポリモーフィズムを使用して:(C++で)組成物を用いて、次の例を見てください

class Window : public Renderer 
{ 
    public: 
     virtual ~Window() {}; 

     void update() 
     { 
      ... 
      draw(); 
     } 
    protected: 
     virtual void draw() = 0; 
} 

組成バージョンがメンバーとして参照を使用していますので、私はそれがもう少し必要であるとしどちらのバージョンでもパフォーマンスは向上していますか?

注:私はthisのような類似の投稿をチェックアウトしましたが、パフォーマンスはカバーしていません。

ありがとうございました!

答えて

5

このような質問をすると、はいメモリ/スピードのトレードオフがあります。

1.組成

  • 8バイト(64ビットアーキテクチャには)参照

2のために使用される可能性があります。ベースクラスの属性の継承

  • 8バイト(64ビットアーキテクチャ上の)あなたのクラスの多形(V-ポインタ)を行う必要がある場合
  • いくつかのオーバーヘッドがあれば(注:ステートフルクラスから継承します仮想コール(総見積もり、そこ変動のロットの
  • 〜20%のオーバーヘッドが

だからあなたはその継承が少しより高価である...しかし、本当にそれだけで目に見えないだと言うかもしれない ))コードのにおいです。グラフィックレンダリングに必要な内部計算と比較した関数呼び出しのオーバヘッドは無視できます。一方


セマンティクスが異なります。あなたが継承するかどうかは重要です。 WindowRendererですか?それは理にかなっていますか?

書き込みsaneコードを先に入力してください。次に必要に応じて最適化する必要があります。

+0

継承は、クラスのサイズが少なくとも基本クラスのサイズだけ増加することを意味します。サイズに加えて基本クラス自体を追加するのはvftableだけではありません。 –

+0

@LuchianGrigore:はい、私はそれがステートレスだと知っているので、 'Renderer'クラスのサイズについてはわかりません。それでも、注目に値する。 –

+0

このサイズはとにかく増えます...異なるWindows間でRendererインスタンスを共有しない限り。 –

4

は、私はあなたが番目のバージョンになりたいとします

class Window : public Renderer 

その場合には、相続によってメモリが実際に大きくなります。これは、あなたが何かを継承するとき、クラスは少なくとも基本クラスのsizeofだけサイズが増加するからです。

実際のオブジェクトではなく参照を保存しているので、最初のバージョンのサイズはわずかに増加します。次は:

class Window 
{ 
    public: 
     Window(Renderer &renderer) : m_renderer(renderer) 
     { } 

     void update() 
     { 
      .... 
      m_renderer.draw(this); 
     } 
    private: 
     Renderer m_renderer; //no reference 
} 

は、より多くのスペースを占有します。

これらの2つの間で決定するときに、より重要なのはです(これらの2つの間の決定はパフォーマンス上の問題ではありません)。構成と継承はさまざまなことを記述します。

WindowRendererの場合、継承を使用します。 WindowsRendererがある場合は、組成を使用してください。

+0

真。しかし、いつか誰かが私に "構成を使用して再利用"と言ったことがありました。そして、ここでは、シンマナンシックスを "Window" **に変更することができます** ** "Renderable" vs "Window" ** ** "Renderer" –

+0

@JensÅkerblomあなたは機能を再利用しているか拡張していますか? –

+0

よくWindowクラスが再利用され、updateメソッドが拡張されています...両方ですか?しかし、これは少し話題外です。 –

関連する問題