2012-05-07 16 views
0

可能性の重複:
C++ virtual function table memory costC++:仮想化によるメモリオーバーヘッド?

私はジュストその読んだ:http://www.parashift.com/c++-faq-lite/virtual-functions.htmlを、私はメモリのオーバーヘッドが原因仮想性にあるのだろうか。 私は現在、スーパーコンピュータ向けに最適化されたコードを書いています。私は、読みやすいコードとメモリ消費量の間に良いバランスを見つける必要があります。それは以下のクラスのためのメモリのオーバーヘッドがどうなるかどのように機能するかを理解するために

class AbstractA {/* SOMETHING */}; 
class AbstractB {/* SOMETHING */}; 
class A : public AbstractA {/* SOMETHING */}; 
class B : public AbstractB {/* SOMETHING */}; 
class A2 : public A {/* SOMETHING */}; 
class B2 : public B {/* SOMETHING */}; 
class AbstractAB : public AbstractA, public AbstractB {/* SOMETHING */}; 
class AbstractAB2 : public AbstractAB {/* SOMETHING */}; 

が、私は、各クラスの10億個のオブジェクトがあると、私は非静的メモリ消費について気にする必要があり。オブジェクトの種類ごとにどれぐらいかかりますか? (AbstractAの各仮想メソッドが "A"タイプのオブジェクトごとにポインタを作成する場合、私は死ぬ...)

+10

'sizeof()'演算子は理由があります。 – Mysticial

+0

@ミステリ​​ー:それはあなたにオブジェクトごとのコストだけを伝えます。通常、クラスごとの費用もあります。 –

+4

@MikeSeymourもし彼が各クラスの10億のインスタンスを持っているならば、クラスごとのコストはオブジェクトごとのコストではごくわずかです。 – Mysticial

答えて

5

Scott MeyerのMore Effective C++のアイテム24を見たいかもしれません。 「仮想関数、多重継承、仮想基底クラス、RTTIのコストを理解する」と題されています。この項目では、Meyersはこれらの施設を利用する際のオーバーヘッドを処理します。

+3

私は*読んでもらえなかったことを見たいかもしれませんか?他の人が知っているはずのアイテム24には何が入っていますか?要約してください。 – GManNickG

+1

「仮想関数、多重継承、virutalベースクラス、およびRTTIのコストを理解する」というタイトルです。それは10ページの長さで、あなたが知りたいことに洞察を与えるかもしれません。また、一種の見知らぬ人として、私はあなたが小柄な人であると断ることを伝えます。それは、あなたの質問に答える提案された情報源を見るために必要な動機づけを思いつくことになります。 – swalog

+2

@ GManNickG項目のタイトルと1行の要約を追加しました。 – sank

3

それは実装定義だが、ちょうど約すべての実装が使用されます(「vptr」と呼ばれる)

  • 1ポインタ多型オブジェクトごとに関数ポインタと他のRTTI情報の
  • 1静的テーブル(と呼ばれますa "vtable")。

オブジェクトごとのコストを確認するには、sizeofを使用できます。膨大な数のクラスを定義しない限り、クラスごとのコストはごくわずかです。

+1

実際、複数の継承を使用する場合、オブジェクトは複数のvptrを持つことさえできます。 –