2011-07-12 10 views
5

¿Qué es vftable en los lenguajes de programación?vftable - ¿Qué es esto?

leí algo así como que es la dirección de una estructura de objeto virtual, pero esta es una información bastante desordenado

Por favor alguien puede explicarlo?

+0

¿Se refiere a un idioma en particular? –

+3

Hay un [artículo en Wikipedia] (http://en.wikipedia.org/wiki/Vtable), ¿has leído eso? –

Respuesta

6

Lo más probable es que represente "Virtual Function Table", y es un mecanismo utilizado por algunas implementaciones en tiempo de ejecución para permitir virtual function dispatch.

Mainstream Las implementaciones de C++ (GCC, Clang, MSVS) lo llaman el vtable. C no tiene polimorfismo. Solo podía especular sobre otros idiomas.


Esto es lo que dice Wikipedia sobre el tema:

tabla de despacho de un objeto contendrá las direcciones de métodos dinámicamente con destino del objeto. Las llamadas a métodos se realizan obteniendo la dirección del método de la tabla de envío del objeto. La tabla de envío es la misma para todos los objetos que pertenecen a la misma clase, y es , por lo tanto, típicamente compartida entre ellos. Los objetos que pertenecen a las clases compatibles con el tipo (por ejemplo, hermanos en una jerarquía de herencia ) tendrán tablas de despacho con el mismo diseño: la dirección de un método dado aparecerá en el mismo desplazamiento para todas las clases compatibles con el tipo . Por lo tanto, al recuperar la dirección del método de un offset de tabla de envío dado obtendrá el método correspondiente a la clase real del objeto . [1]

estándares de C++ no lo hacen Encargar a exactamente cómo envío dinámico debe ser implementado , pero los compiladores suelen utilizar variaciones menores en el mismo modelo básico .

Normalmente, el compilador crea un vtable por separado para cada clase. Cuando se crea un objeto , se agrega un puntero a este vtable, llamado puntero de tabla virtual , vpointer o VPTR, como un miembro oculto de este objeto (convirtiéndose en su primer miembro a menos que sea el último [2]) . El compilador también genera código "oculto" en el constructor de cada clase para inicializar los vipinters de sus objetos a la dirección del vtable correspondiente. Tenga en cuenta que la ubicación del vpointer en la instancia del objeto no es estándar entre todos los compiladores, y al depender de , la posición puede dar como resultado un código no compatible. Por ejemplo, g ++ previamente colocó el vpointer al final del objeto. [3]

  1. Ellis & Stroustrup 1990, pp. 227-232
  2. Heading "Multiple Inheritance"
  3. CodeSourcery C++ ABI
+0

Siempre puede construir un vtable usted mismo en C, lo que quiere decir es que "C no tiene primitivas en el lenguaje para el polimorfismo" :-) –

+0

@Kerrek: Sí; estamos hablando de lo que un "vftable" sería "en altos lenguajes de programación", es decir, como parte del lenguaje. :) –

2

Vftable no se menciona explícitamente en la norma C++, pero la mayoría (si no todas) las implementaciones lo usan para la implementación de funciones virtuales.

Para cada clase con funciones virtuales, el compilador crea una matriz de indicadores de función que son los indicadores de la última versión modificada de las funciones virtuales de esa clase. Entonces cada objeto tiene un puntero al vtable de su clase dinámica.

Ver esta pregunta y su respuesta aceptada para más ilustraciones

Virtual dispatch implementation details

+0

Si pudiera, dividiría los puntos de aceptación a la mitad porque su enlace me ha dado información útil también –