[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