Spese generali di lezioni D
Domanda
Pensavo di aver sentito che le lezioni D hanno due parole (2 void *) di sovraccarico invece della parola richiesta da C ++.Ho anche sentito che il layout Vtable è incompatibile con C ++.Mi ricordo correttamente?Se sì, qual è la logica per queste decisioni?
Soluzione
Alcune cose:
- .
- In C ++, una classe che non ha funzioni virtuali avrà zero overhead.
- In D, una classe eredita sempre le funzioni virtuali da
Object
, quindi ha sempre quel generatore__vptr
, ma ha anche un__monitor
, che gli oggetti di classe C ++ non hanno. - In entrambi C ++ e D, ci sarà ulteriore
vptr
per ogni interfaccia che la classe implementa.
Il layout VTABLE è incompatibile con C ++ perché D include un puntatore a un'istanza TypeInfo
, che ha informazioni di tipo Runtime sulla classe.C ++ ovviamente non ce l'ha, quindi è incompatibile.
Altri suggerimenti
Il puntatore extra è a un oggetto monitor per le classi sincronizzate (apparentemente sono state parlate di rimuoverlo per le classi non sincronizzate, ma non è accaduto).Il layout è documentato in sezione ABI della specifica.
Non sono sicuro di come il layout Vtable differisca da come i compilatori C ++ lo fanno.Qualcun altro può probabilmente rispondere a questo.