仮想テーブルはどのようにメモリに格納されますか? 彼らのレイアウト?
例えば
class A{
public:
virtual void doSomeWork();
};
class B : public A{
public:
virtual void doSomeWork();
};
クラス A とクラス B の仮想テーブルのメモリ内でのレイアウトはどのようになりますか?
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
メモリ内の vtable レイアウトは完全にコンパイラに依存します。「正しい」または普遍的なアプローチは取られていません。
Open Watcomのクラス レイアウトの非常に詳細な説明については、クラス レイアウトノートを参照してください。