variable validas una tipos que programacion nombres nombran las informatica ejemplos declaracion como c++ vtable

c++ - validas - ¿Dónde en la memoria se almacena vtable?



tipos de variables informatica (6)

Cada instancia que incluye la función virtual tiene un puntero de función virtual que apunta a la tabla de función virtual (vbtl), solo pudimos ubicar el vtbl a través de la instancia. o puede usar el objdump para leer el símbolo del archivo ELF, tal vez pueda encontrar la respuesta. Espero que el siguiente ejemplo pueda hechizarte.

#include <iostream> #include <stdio.h> typedef void (*fun_pointer)(void); using namespace std; class Test { public: Test() { cout<<"Test()."<<endl; } virtual void print() { cout<<"Test::Virtual void print()."<<endl; } virtual void print2() { cout<<"Test::virtual void print2()."<<endl; } }; class TestDrived:public Test { public: TestDrived() { cout<<"TestDrived()."<<endl; } virtual void print() { cout<<"TestDrived::virtual void print()."<<endl; } virtual void print2() { cout<<"TestDrived::virtual void print2()."<<endl; } void GetVtblAddress() { cout<<"vtbl address:"<<(int*)this<<endl; } void GetFirstVtblFunctionAddress() { cout<<"First vbtl function address:"<<(int*)*(int*)this+0 << endl; } void GetSecondVtblFunctionAddress() { cout<<"Second vbtl function address:"<<(int*)*(int*)this+1 << endl; } void CallFirstVtblFunction() { fun = (fun_pointer)* ( (int*) *(int*)this+0 ); cout<<"CallFirstVbtlFunction:"<<endl; fun(); } void CallSecondVtblFunction() { fun = (fun_pointer)* ( (int*) *(int*)this+1 ); cout<<"CallSecondVbtlFunction:"<<endl; fun(); } private: fun_pointer fun; }; int main() { cout<<"sizeof(int):"<<sizeof(int)<<"sizeof(int*)"<<sizeof(int*)<<endl; fun_pointer fun = NULL; TestDrived a; a.GetVtblAddress(); a.GetFirstVtblFunctionAddress(); a.GetSecondVtblFunctionAddress(); a.CallFirstVtblFunction(); a.CallSecondVtblFunction(); return 0; }

¿Dónde en la memoria se almacena vtable?


Depende del compilador.

En VC ++, el puntero vtable se almacena al comienzo de la asignación del objeto, antes de cualquier dato del miembro. (Siempre que su clase tenga al menos una función miembro virtual).

También puede haber múltiples punteros de vtable, si su clase se hereda de otras clases con vtables.

Los propios vtables están asignados estáticamente en algún lugar de su espacio de direcciones.

Luego el diseño del objeto se ve como (para una instancia de C):

A''s VTable ptr A''s member variables. B''s Vtable ptr B''s member variables. C''s member variables.

por la jerarquía

class A { virtual Ax() {} int a, b; }; class B { virtual Bx() {} int c, d; }; class C : public A, public B { int foo, bar; };


El vptr comúnmente al principio del objeto ( Imperfect C ++ , Backyard Hotrodding C ++ ), pero eso no está garantizado en el estándar. El uso de vptrs y vtables no está garantizado en el estándar.

Si realmente necesita saber dónde está, es común usar algo como COM, XPCOM, UNO, etc., que se implementan esencialmente creando un lugar donde se encuentra algo como un vptr y establezca formas de usarlos.


Vptr y Vtable se almacenan en el segmento de datos ...

Vtable es como una matriz de puntero de función.

Vtable y Vptr están creando en tiempo de compilación que obtendrá memoria en tiempo de ejecución y las entradas de vtable son direcciones de funciones virtuales.

Cada objeto de una clase que contenga una función virtual tendrá un puntero adicional que apunta a la tabla virtual que se conoce como puntero virtual.

cada vez que llamamos a una función virtual usando un objeto, primero el Vptr corrosivo leerá la función de Vtable en tiempo de ejecución y finalmente se llamará a la función.


Vtable? ¿Qué vtable? El estándar de C ++ no menciona un vtable. Cada compilador puede implementar funciones virtuales como quiera. Y eso incluye colocar el vtable en cualquier lugar que le guste.