Considere:C++
class A
{
public:
virtual void update() = 0;
}
class B : public A
{
public:
void update() { /* stuff goes in here... */ }
private:
double a, b, c;
}
class C {
// Same kind of thing as B, but with different update function/data members
}
Ahora estoy haciendo:
A * array = new A[1000];
array[0] = new B();
array[1] = new C();
//etc., etc.
si llamo sizeof(B)
, el tamaño devuelto es el tamaño requerido por los 3 miembros dobles, además de Se requieren algunos gastos generales para la tabla de punteros de funciones virtuales. Ahora, volviendo a mi código, resulta que 'sizeof (myclass)' es 32; es decir, estoy usando 24 bytes para mis miembros de datos y 8 bytes para la tabla de funciones virtuales (4 funciones virtuales). Mi pregunta es: ¿hay alguna manera de simplificar esto? Mi programa eventualmente usará muchísima memoria, y no me gusta el sonido del 25% de lo que consumen los punteros de funciones virtuales.
No olvide destructores virtuales. – GManNickG
En cuanto a su estrategia de asignación, es mejor que investigue utilizando un asignador personalizado de cada 'B',' C', etc. Usar un 'nuevo' básico para una gran cantidad de objetos individuales puede agregar más sobrecarga de lo que cree . –
Como se indica en las respuestas, solo paga un puntero por instancia (4 bytes en x86 y 8 bytes en x64). Sin embargo, la alineación de memoria puede cambiar la imagen un poco (por ejemplo, si tiene una clase con un char y un método virtual, generalmente tomará 8 bytes en x86). Además, el compilador de Microsoft C++ tiene un error conocido al alinear el vfptr que puede agregar 4 o más bytes al tamaño de la clase. – sbk