仮想テーブルはどのようにメモリに格納されますか? 彼らのレイアウト?
例えば
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のクラス レイアウトの非常に詳細な説明については、クラス レイアウトノートを参照してください。