A sobrecarga das classes D
Pergunta
Eu pensei que eu ouvi que D classes de ter duas palavras (2 void*) de sobrecarga em vez de uma palavra exigido pelo C++.Eu também ouvi que a vtable layout é incompatível com o C++.Não me lembro?Em caso afirmativo, qual é a justificativa para essas decisões?
Solução
Algumas coisas:
- Em C++, uma classe que não tem funções virtuais terão zero sobrecarga.
- Em D, uma classe herda sempre de funções virtuais a partir de
Object
, de forma que ele sempre tem que__vptr
a sobrecarga, mas também tem um__monitor
, que C++ classe de objetos não têm. - Em C++ e D, haverá adicionais
vptr
para cada interface que a classe implementa.
O esquema vtable é incompatível com o C++, porque D inclui um ponteiro para um TypeInfo
instância, que tem tempo de execução do tipo de informações sobre a classe.C++, obviamente, não tem que, portanto, é incompatível.
Outras dicas
O ponteiro extra é para um objeto de monitor para classes sincronizadas (aparentemente já have sido falar sobre a remoção para classes não sincronizadas, mas isso não aconteceu).O layout é documentado no ABI seção da especificação.
Não tenho certeza de como o layout vtable difere de como os compiladores C ++ fazem isso.Alguém provavelmente pode responder isso.