Dクラスには、C ++で必要な1ワードではなく、2ワード(2 void *)のオーバーヘッドがあると聞きました。また、vtableレイアウトはC++と互換性がないと聞きました。正しく覚えていますか?もしそうなら、これらの決定の根拠は何ですか?
2 に答える
6
いくつかのこと:
- C++ では、仮想関数を持たないクラスのオーバーヘッドはゼロになります。
- D では、クラスは常に から仮想関数を継承する
Object
ため、常にその__vptr
オーバーヘッドがありますが__monitor
、C++ クラス オブジェクトにはない もあります。 - C++ と D の両方
vptr
で、クラスが実装する各インターフェイスに追加があります。
D にはインスタンスへのポインターが含まれているため、vtable レイアウトは C++ と互換性がありません。このポインターにはTypeInfo
、クラスに関する実行時の型情報が含まれています。C++ には明らかにそれがないため、互換性がありません。
于 2012-07-29T09:45:12.610 に答える
4
追加のポインターは、同期されたクラスのモニター オブジェクトへのポインターです (同期されていないクラスのモニター オブジェクトを削除するという話があったようですが、それは実現していません)。レイアウトは、仕様のABI セクションに記載されています。
vtable のレイアウトが C++ コンパイラのやり方とどう違うのかよくわかりません。他の誰かがおそらくそれに答えることができます。
于 2012-07-28T20:35:33.837 に答える