Pelo que sei, o tamanho de uma classe em c ++ depende dos fatores abaixo -
- Tamanho de todos os membros de dados não estáticos.
- Ordem dos membros dos dados.
- Se o preenchimento de bytes estiver ativado ou não.
- Tamanho de sua classe base imediata.
- A existência de funções virtuais.
- Modo de herança (herança virtual).
Agora eu criei 2 classes como abaixo -
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;
};
agora, verificando o tamanho de A e BI, veja
- tamanho de A: 16
- tamanho de B: 16
minha suposição é que o char c na classe B é acomodado no "buraco" deixado na classe A.
Mas, o que me confunde é o cenário abaixo, em que eu publico os membros
class A{
public:
int a;
short d;
int b;
char s;
};
class B : public A{
public:
char c;
};
Agora o tamanho se torna
- tamanho de A: 16
- tamanho de B: 20
Não consigo entender o motivo dessa diferença.
c++
inheritance
memory
J.DOE
fonte
fonte
Respostas:
O Itanium ABI usa a definição de POD C ++ 03 para definir classes que são "POD para fins de layout". Ter membros de dados privados desqualifica uma classe de ser um agregado e, portanto, um POD no C ++ 03:
Ser uma classe POD desativa a reutilização do preenchimento da cauda :
Portanto, no seu primeiro exemplo,
A
não é um POD para fins de layout e seu preenchimento de cauda pode ser usadoB::c
, mas no segundo exemplo, é um POD e seu preenchimento de cauda não pode ser reutilizado.fonte