technologies parts empresa descargar brasil autopartes delphi

delphi - parts - ¿Cuál es la diferencia entre los métodos dinámicos y virtuales?



delphi technologies (1)

¿Cómo los métodos dinámicos mejoran el tamaño del código?
¿Qué significa el tamaño del código? ¿Significa el tamaño del archivo program.exe?

Según el Manual:

En general, los métodos virtuales son la forma más eficiente de implementar el comportamiento polimórfico. Los métodos dinámicos son útiles cuando una clase base declara muchos métodos reemplazables que son heredados por muchas clases descendientes en una aplicación, pero solo anulados ocasionalmente

Lo que obtengo si uso dinámico en lugar de virtual cuando solo una de las clases heredadas anula el método, ya que el manual también dice:

Los métodos virtuales optimizan la velocidad, mientras que los métodos dinámicos optimizan el tamaño del código.


Los métodos virtuales se implementan con una tabla de métodos virtuales (VMT). Hay un VMT para cada clase. El VMT contiene una entrada para cada método virtual en la clase. Y esa entrada es la dirección del método.

Esto permite una llamada muy eficiente. Simplemente obtiene la dirección del VMT que se encuentra en un desplazamiento fijo de Self . Luego busca el puntero del método por índice y llama al método.

Lo que esto significa es que si tiene una clase con muchos métodos virtuales y obtiene una subclase, creará un VMT completamente nuevo con todos los métodos virtuales. Y si no ha anulado muchos de ellos, encontrará que las VMT tienen muchas coincidencias.

Esto solía importar en los días de 16 bit. Las VMT podrían ocupar mucho espacio en la imagen ejecutable (eso es lo que se entiende por tamaño de código) y podría quedarse sin espacio para las VMT. Así se introdujeron métodos dinámicos. El análogo al VMT es la tabla de métodos dinámicos, DMT. Esto se implementa de manera diferente para evitar la repetición cuando los métodos no se anulan. El inconveniente es que llamar a métodos dinámicos es más caro.

En los tiempos modernos, desde los 32 bits, y especialmente con los ejecutables muy gordos que produce Delphi, estos problemas de tamaño no importan. Y así, todo buen consejo es utilizar métodos virtuales exclusivamente.

Las implementaciones de la tabla de métodos virtuales son bien entendidas y hay muchas referencias que se pueden encontrar para entenderlas. Eso es menos para los métodos dinámicos que son bastante pintorescos. Las mejores fuentes de información que he encontrado son del blog de Hallvard Vassbotn: