1

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

4

2 に答える 2

6

いくつかのこと:

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

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

于 2012-07-29T09:45:12.610 に答える
4

追加のポインターは、同期されたクラスのモニター オブジェクトへのポインターです (同期されていないクラスのモニター オブジェクトを削除するという話があったようですが、それは実現していません)。レイアウトは、仕様のABI セクションに記載されています。

vtable のレイアウトが C++ コンパイラのやり方とどう違うのかよくわかりません。他の誰かがおそらくそれに答えることができます。

于 2012-07-28T20:35:33.837 に答える