¿Dónde está almacenada la memoria?¿Dónde se almacena la memoria en vtable?
Respuesta
Depende del compilador.
En VC++, el puntero vtable almacenado al principio de la asignación de objeto, antes de cualquier información de miembro. (Siempre que su clase tenga al menos una función de miembro virtual).
También puede haber múltiples punteros vtable, si su clase se hereda de otras clases con vtables.
Los vtables en sí están asignados estáticamente en algún lugar de su espacio de direcciones.
Entonces la disposición objeto parece (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.
para 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;
};
VPTR comúnmente al inicio del objeto (Imperfecto C++, Backyard Hotrodding C++) pero eso no está garantizado en el estándar re. 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 al crear un lugar donde se encuentra algo así como un vptr y establecer formas de usalos, usalos a ellos.
Los enlaces de CM y CORBA C++ que he usado dejan la ubicación del vtable al compilador de C++. –
Gracias, eliminé CORBA de la lista –
Vtable? ¿Qué vtable? El estándar C++ no menciona un vtable. Cada compilador puede implementar funciones virtuales de la forma que quiera. Y eso incluye colocar el vtable donde quiera.
. Creo que el vtable puede estar en cualquier lugar excepto en la dirección de inicio del objeto. Según entiendo, la dirección del primer elemento es también la dirección inicial de la estructura. –
No, eso no es un requisito. Es el caso para los tipos POD, pero los tipos POD no tienen un vtable, por lo que no es un problema. Para los tipos que no son POD, no hay garantía de que la dirección de la estructura sea la misma que la dirección del primer elemento. – jalf
Cada instancia que incluye la función virtual tiene un puntero de función virtual que apunta a la tabla de funciones virtuales (vbtl), solo pudimos ubicar el vtbl a través de la instancia. o puede usar objdump para leer el símbolo del archivo ELF, quizás pueda encontrar la respuesta. Espero que el siguiente ejemplo pueda ayudarte.
#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;
}
VPTR y Vtable se almacenan en el segmento de datos ...
Vtable es como un conjunto de puntero de función.
Vtable y Vptr están creando en tiempo de compilación, lo que generará memoria en tiempo de ejecución y las entradas de vtable son direcciones de funciones virtuales.
Cada objeto de una clase que contiene una función virtual tendrá un puntero adicional que apunte a la tabla virtual que se conoce como puntero virtual.
siempre que llamemos a una función virtual usando un objeto, primero el Vptr corrosponding leerá la función de Vtable en tiempo de ejecución y finalmente se llamará a la función.
- 1. ¿Dónde se almacena ViewState?
- 2. ¿Dónde se almacena el proyecto en Eclipse?
- 3. ¿Cómo se almacena la matriz en la memoria?
- 4. ¿Dónde se almacena la información en caché en ASP.NET?
- 5. ASP.NET: ¿Dónde/cómo se almacena en caché web.config?
- 6. ¿Cómo se almacena una matriz 2D dinámica en la memoria?
- 7. ¿Dónde se almacena mi alias git?
- 8. ¿Dónde se almacena .NET "Almacenamiento aislado"?
- 9. joomla - ¿dónde se almacena la clasificación de categoría?
- 10. ¿Dónde se almacena la configuración de "Jenkins URL"?
- 11. ¿Dónde `getchar()` almacena la entrada del usuario?
- 12. ¿Dónde almacena CLR las clases estáticas?
- 13. ¿Dónde se almacena en caché el código .NET JIT-compiled?
- 14. ¿Dónde almacena R los paquetes?
- 15. ¿Dónde almacena nginx el rewrite_log?
- 16. ¿Dónde almacena linux mi syslog?
- 17. ¿Dónde almacena las variables en jinja?
- 18. ¿Dónde Glassfish 2.1 almacena en caché JSP?
- 19. ¿Cómo se puede saber si un archivo se almacena en caché en la memoria en Linux?
- 20. ¿Qué se almacena en el montón y qué se almacena en la pila?
- 21. ¿Dónde se almacena este archivo de Rails? db/development.sqlite3
- 22. ¿Dónde se almacenan los métodos en la memoria?
- 23. ¿Dónde se almacenará una cadena constante en la memoria?
- 24. ¿Dónde almacena Eclipse la configuración * y los complementos * en userdir?
- 25. ¿Cuándo se crea VTable en C++?
- 26. ¿Dónde almacena Windows su configuración "Abrir con"?
- 27. ¿Dónde almacena Firefox javascript/HTML localStorage?
- 28. ¿Dónde se almacena la información de perfil de usuario en la base de datos Dotnetnuke?
- 29. ¿Cómo se almacena btree en el disco?
- 30. ¿Dónde almacena contraseñas de base de datos?
Creo que estás hablando de vptr's, es decir, punteros a vtables. Los Vtables mismos se almacenan generalmente en el segmento de datos estáticos, ya que son específicos de clase (frente a específicos de objeto). –
De hecho, modifiqué mi publicación :) –
El diseño del objeto es para una instancia de C, ¿verdad? (A diferencia de A, a B y C) – Niklas