D'après ce que je sais, la taille d'une classe en c ++ dépend des facteurs ci-dessous -
- Taille de tous les membres de données non statiques.
- Ordre des membres de données.
- Si le remplissage d'octets est activé ou non.
- Taille de sa classe de base immédiate.
- L'existence de fonctions virtuelles.
- Mode d'héritage (héritage virtuel).
Maintenant, j'ai créé 2 classes comme ci-dessous -
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;
};
maintenant sur la vérification de la taille de A et BI voir
- taille de A: 16
- taille de B: 16
mon hypothèse est que le caractère c dans la classe B est logé dans le "trou" laissé dans la classe A.
Mais, ce qui m'a dérouté est le scénario ci-dessous dans lequel je rend les membres publics
class A{
public:
int a;
short d;
int b;
char s;
};
class B : public A{
public:
char c;
};
Maintenant, la taille devient
- taille de A: 16
- taille de B: 20
Je n'arrive pas à comprendre la raison de cette différence.
c++
inheritance
memory
J.DOE
la source
la source
Réponses:
L'Itanium ABI utilise la définition C ++ 03 de POD pour définir les classes qui sont "POD à des fins de mise en page". Avoir des membres de données privées disqualifie une classe d'être un agrégat et donc un POD en C ++ 03:
Être une classe POD désactive la réutilisation du rembourrage de queue :
Ainsi, dans votre premier exemple, ce
A
n'est pas un POD à des fins de mise en page et son rembourrage de queue peut être utiliséB::c
, mais dans votre deuxième exemple, c'est un POD, et son rembourrage de queue ne peut pas être réutilisé.la source