Por lo que sé, el tamaño de una clase en c ++ depende de los siguientes factores:
- Tamaño de todos los miembros de datos no estáticos.
- Orden de los miembros de datos.
- Si el relleno de bytes está habilitado o no.
- Tamaño de su clase base inmediata.
- La existencia de funciones virtuales.
- Modo de herencia (herencia virtual).
Ahora he creado 2 clases de la siguiente manera:
class A{
int a;
short s;
int b;
char d;
};// kept a char at last on purpose to leave a "hole"
class B : public A{
char c;
};
ahora en comprobar el tamaño de A y BI ver
- tamaño de A: 16
- tamaño de B: 16
mi suposición es que el carbón en la clase B se acomoda en el "agujero" que queda en la clase A.
Pero, lo que me confunde es el siguiente escenario en el que hago públicos a los miembros
class A{
public:
int a;
short d;
int b;
char s;
};
class B : public A{
public:
char c;
};
Ahora el tamaño se convierte
- tamaño de A: 16
- tamaño de B: 20
Parece que no puedo entender la razón de esta diferencia.
c++
inheritance
memory
J.DOE
fuente
fuente
Respuestas:
El Itanium ABI utiliza la definición C ++ 03 de POD para definir clases que son "POD para propósitos de diseño". Tener miembros de datos privados descalifica a una clase de ser un agregado y, por lo tanto, POD en C ++ 03:
Ser una clase POD deshabilita la reutilización del relleno de la cola :
Por lo tanto, en su primer ejemplo,
A
no es un POD para fines de diseño y su relleno de cola se puede usarB::c
, pero en su segundo ejemplo, es un POD y su relleno de cola no se puede reutilizar.fuente