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?

È stato utile?

Soluzione

Alcune cose:

    .
  1. In C ++, una classe che non ha funzioni virtuali avrà zero overhead.
  2. 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.
  3. In entrambi C ++ e D, ci sarà ulteriore vptr per ogni interfaccia che la classe implementa.
  4. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top