質問
Dクラスには、C++で必要な1つの単語ではなく、2つの単語(2void*)のオーバーヘッドがあると聞いたと思いました。また、vtableレイアウトはC++と互換性がないと聞きました。私は正しく覚えていますか?もしそうなら、これらの決定の根拠は何ですか?
解決
いくつかのこと:
- C++では、仮想関数を持たないクラスは次のようになります ゼロ オーバーヘッド
- Dでは、クラスは常にから仮想関数を継承します
Object
, 、だからそれは常にそれを持っています__vptr
オーバーヘッド、しかしまたaを持っています__monitor
, 、C++クラスオブジェクトにはありません。 - C++とDの両方で、追加のものがあります
vptr
クラスが実装する各インターフェイスに対して。
Dにはaへのポインタが含まれているため、vtableレイアウトはC++と互換性がありません TypeInfo
クラスに関する実行時型情報を持つインスタンス。C++は明らかにそれを持っていないので、互換性がありません。
他のヒント
追加のポインタは、同期クラスのモニタオブジェクトになります(明確なクラスの削除については明らかに協議されていますが、起こりません)。レイアウトは、 abiセクションに記載されています。
VTableレイアウトがC ++コンパイラのどれだけ異なるかはわかりません。他の誰かがおそらくそれに答えることができます。
所属していません StackOverflow