2009-04-15 10 views
6

Según tengo entendido, todas las funciones de los miembros son virtuales en D, pero el compilador puede hacer que las funciones no sean virtuales si no se anulan.¿Hay alguna forma de garantizar que las funciones miembro sean virtuales en D?

Lo que no tengo claro es qué ocurre cuando compilas un módulo en el que las funciones de miembro no se anulan y luego importas ese módulo en otro lugar donde anulas una función de miembro. No creo que vuelva a compilar el módulo original. ¿Simplemente supone que cualquier función miembro con enlace externo es virtual?

Respuesta

5

Todas las funciones miembro D son virtuales por defecto. No creo que exista ningún compilador que realmente haga las funciones no virtuales como una optimización. Sin embargo, puede hacerlo manualmente marcando la clase o la función como "final".

1

Creo que FeepingCreature es correcto, pero además creo que puede suponer que tales optimizaciones solo serán consideradas por el compilador si crea directamente un ejecutable desde las fuentes.

2

FeepingCreature es principalmente correcto, excepto para las funciones de plantilla que no pueden hacerse virtuales.

2

Cómo se implementa esto es específico del compilador y del enlazador. Pero una situación común donde las llamadas a funciones virtuales pueden optimizarse, es cuando tienes una clase instanciada localmente. Entonces las llamadas a funciones se pueden realizar directamente dentro de este alcance, porque el tipo de la clase es completamente conocido en tiempo de compilación. Esto se puede hacer en un nivel de compilador.

Además de esto, si el enlazador se da cuenta de que la implementación de la función nunca se reemplaza, entonces el enlazador podría hacer la optimización y reemplazar las llamadas a funciones virtuales con llamadas a funciones directas en esa clase. En particular, si una clase nunca se deriva, todas las llamadas a las funciones miembro se pueden realizar directamente. Es como si el enlazador insertara la palabra clave 'final' siempre que fuera posible. (Es posible que el vinculador no aplique esta optimización a las clases y funciones exportadas, ya que el vinculador no sabe si las funciones están anuladas en otras bibliotecas o ejecutables).

Cuestiones relacionadas