Pregunta

Me pareció haber oído que las clases D tienen dos palabras (2 vacías*) de sobrecarga en lugar de la palabra requerida por C++.También escuché que el diseño de vtable es incompatible con C++.¿Recuerdo correctamente?En caso afirmativo, ¿cuál es el fundamento de estas decisiones?

¿Fue útil?

Solución

Unas pocas cosas:

  1. En C++, una clase que no tiene funciones virtuales tendrá cero gastos generales.
  2. En D, una clase siempre hereda funciones virtuales de Object, entonces siempre tiene eso __vptr por encima, pero también tiene un __monitor, que los objetos de clase C++ no tienen.
  3. Tanto en C++ como en D, habrá vptr para cada interfaz que implementa la clase.

El diseño de vtable es incompatible con C++ porque D incluye un puntero a un TypeInfo instancia, que tiene información de tipo de tiempo de ejecución sobre la clase.C++ obviamente no tiene eso, por lo que es incompatible.

Otros consejos

El puntero adicional es para un objeto de monitor para clases sincronizadas (aparentemente se han hablado de eliminarlo para clases no cresponadas, pero eso no ha sucedido).El diseño se documenta en la sección de ABI de la especificación.

No estoy seguro de cómo el diseño de VTTable difiere de cómo los compiladores de C ++ lo hacen.Alguien más puede responder eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top