Solo los datos de instancia aumentan el tamaño de las instancias de una clase (en todas las implementaciones que conozco), excepto que si agrega funciones virtuales o hereda de una clase con funciones virtuales, entonces toma un solo golpe por un puntero de tabla v.
Además, como otra persona menciona correctamente el tamaño mínimo de una clase es de 1 byte.
Algunos ejemplos:
// size 1 byte (at least)
class cls1
{
};
// size 1 byte (at least)
class cls2
{
// no hit to the instance size, the function address is used directly by calling code.
int instanceFunc();
};
// sizeof(void*) (at least, for the v-table)
class cls3
{
// These functions are indirectly called via the v-table, a pointer to which must be stored in each instance.
virtual int vFunc1();
// ...
virtual int vFunc99();
};
// sizeof(int) (minimum, but typical)
class cls4
{
int data;
};
// sizeof(void*) for the v-table (typical) since the base class has virtual members.
class cls5 : public cls3
{
};
implementaciones del compilador pueden manejar la herencia virtual múltiple con múltiples punteros v-mesa u otros otros métodos, por lo que estos también tendrán efecto sobre el tamaño de las clases.
Finalmente, las opciones de alineación de datos de los miembros pueden tener un impacto. El compilador puede tener alguna opción o #pragma
para especificar que los datos de miembro deben tener una dirección de inicio que es un múltiplo del número de bytes especificado. Por ejemplo, con la alineación en 4 límites de bytes y asumiendo sizeof(int) = 4
:
// 12 bytes since the offset of c must be at least 4 bytes from the offset of b. (assuming sizeof(int) = 4, sizeof(bool) = 1)
class cls6
{
int a;
bool b;
int c;
};
99 métodos? arrgh .. – Nim
@Nim: Quería realmente transmitir el mensaje.;) – Zeenobit