質問

Dクラスには、C++で必要な1つの単語ではなく、2つの単語(2void*)のオーバーヘッドがあると聞いたと思いました。また、vtableレイアウトはC++と互換性がないと聞きました。私は正しく覚えていますか?もしそうなら、これらの決定の根拠は何ですか?

役に立ちましたか?

解決

いくつかのこと:

  1. C++では、仮想関数を持たないクラスは次のようになります ゼロ オーバーヘッド
  2. Dでは、クラスは常にから仮想関数を継承します Object, 、だからそれは常にそれを持っています __vptr オーバーヘッド、しかしまたaを持っています __monitor, 、C++クラスオブジェクトにはありません。
  3. C++とDの両方で、追加のものがあります vptr クラスが実装する各インターフェイスに対して。

Dにはaへのポインタが含まれているため、vtableレイアウトはC++と互換性がありません TypeInfo クラスに関する実行時型情報を持つインスタンス。C++は明らかにそれを持っていないので、互換性がありません。

他のヒント

追加のポインタは、同期クラスのモニタオブジェクトになります(明確なクラスの削除については明らかに協議されていますが、起こりません)。レイアウトは、 abiセクションに記載されています。

VTableレイアウトがC ++コンパイラのどれだけ異なるかはわかりません。他の誰かがおそらくそれに答えることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top