0

重複の可能性:
C++ 仮想関数テーブルのメモリ コスト

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" の各オブジェクトのポインターを作成する場合、私は死ぬ...)

4

2 に答える 2

5

Scott Meyer のMore Effective C++の Item 24 を見たいと思うかもしれません。「仮想関数、多重継承、仮想基底クラス、RTTI のコストを理解する」というタイトルです。この項目で Meyers は、これらの機能を利用する際のオーバーヘッドについて説明します。

于 2012-05-07T05:29:40.103 に答える
3

これは実装定義ですが、ほぼすべての実装で以下が使用されます。

  • ポリモーフィックオブジェクトごとに1つのポインタ(「vptr」と呼ばれる)
  • ポリモーフィッククラスごとに1つの関数ポインタとその他のRTTI情報(「vtable」と呼ばれる)の静的テーブル。

sizeofオブジェクトごとのコストを確認するために使用できます。膨大な数のクラスを定義しない限り、クラスごとのコストはおそらく無視できます。

于 2012-05-07T05:38:35.533 に答える