12

仮想テーブルはどのようにメモリに格納されますか? 彼らのレイアウト?

例えば

class A{
    public:
         virtual void doSomeWork();
};

class B : public A{
    public:
         virtual void doSomeWork();
};

クラス A とクラス B の仮想テーブルのメモリ内でのレイアウトはどのようになりますか?

4

6 に答える 6

36

Linux の GCC コンパイラの場合:

g++ -fdump-class-hierarchy example.h

出力は次のとおりです。

A の Vtable
A::_ZTV1A: 3u エントリ
0 (整数 (*)(...))0
8 (整数 (*)(...))(& _ZTI1A)
16 (整数 (*)(...))A::doSomeWork

クラスA
   サイズ=8 整列=8
   ベースサイズ=8 ベースアライン=8
A (0x7fb76785a4e0) 0 ほとんど空
    vptr=((& A::_ZTV1A) + 16u)

B の Vtable
B::_ZTV1B: 3u エントリ
0 (整数 (*)(...))0
8 (整数 (*)(...))(& _ZTI1B)
16 (整数 (*)(...))B::doSomeWork

クラスB
   サイズ=8 整列=8
   ベースサイズ=8 ベースアライン=8
B (0x7fb7678510d0) 0 ほとんど空
    vptr=((& B::_ZTV1B) + 16u)
  A (0x7fb76785a540) 0 ほとんど空
      B のプライマリ (0x7fb7678510d0)

また、共有オブジェクト内の仮想テーブルの内容を一覧表示するvtable-dumperツールも作成しました。このツールを使用すると、ヘッダーをコンパイルする必要はありません。オブジェクトで実行するだけです。

vtable-dumper SHLIB
于 2012-07-13T07:37:45.303 に答える
6

メモリ内の vtable レイアウトは完全にコンパイラに依存します。「正しい」または普遍的なアプローチは取られていません。

于 2009-08-27T16:14:02.610 に答える
3

ウィキペディアから:

C++ 標準では、動的ディスパッチをどのように実装する必要があるかを正確に規定していません。

したがって、答えはノーです。vtable のレイアウトは実装定義です。

于 2009-08-27T16:16:05.633 に答える
1

Open Watcomのクラス レイアウトの非常に詳細な説明については、クラス レイアウトノートを参照してください。

于 2009-08-27T21:02:58.020 に答える