[C con Clase] Duda sobre performance de clases virtuales

Programante programante en gmail.com
Jue Oct 9 21:12:33 CEST 2008


Ferran Ferri escribió:
> Mi pregunta es la siguiente. Si yo tengo este codigo:
>
> A a = B();
>
> En tiempo de ejecucion se crea una tabla de vPtr (virtaul pointers). 
> Cada vez que llame a a.foo(), se realiza la conversion para reconocer 
> desde donde viene la llamada? O solo durante la creacion de la clase. 
> Por que si cada vez que llamo a la funcion, el programa internamente 
> tiene que conocer de que tipo es, entonces en aplicaciones intensivas 
> puede tener un rendimiento sensiblemente peor, no es asi?
>
> Muchas gracias
> Ferran
Las tablas no se crean en tiempo de ejecución sino de compilación. En 
tiempo de ejecución es la búsqueda.
Normalmente, los compiladores implementan las funciones virtuales así:

/* Punteros a funciones virtuales de A */
struct vTable_A {
  void (*Foo)();
};

/* Clase A (si fuese instanciable) */
struct A {
  struct vTable_A* vTbl; // <-- Apuntará a una zona de memoria con las 
implementaciones para A
  /* Datos de A */
};

struct B {
  struct vTable_A* vTbl; // <-- Apuntará a una zona de memoria con las 
implementaciones para B
  /* Datos de A*/
  /* Datos de B*/
};

/* Creación */
A a = B(); //Construcción y copia normal de clases, únicamente que 
también se construye/copia vTbl

/* a.foo(); */
a.vTbl->foo();






Más información sobre la lista de distribución Cconclase