Pourquoi la taille de la classe en c ++ dépend-elle du statut public / privé des membres de données?

23

D'après ce que je sais, la taille d'une classe en c ++ dépend des facteurs ci-dessous -

  1. Taille de tous les membres de données non statiques.
  2. Ordre des membres de données.
  3. Si le remplissage d'octets est activé ou non.
  4. Taille de sa classe de base immédiate.
  5. L'existence de fonctions virtuelles.
  6. 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.

J.DOE
la source
1
Pourquoi la taille de la classe en c ++ dépend-elle du statut public / privé des membres de données? - Non. Ce sont des détails d'implémentation dépendant du compilateur.
PaulMcKenzie
1
Alors, quel compilateur utilisez-vous?
Romen
2
@PaulMcKenzie En fait, c'est le cas. La norme oblige les membres ayant le même accès à être regroupés, ce qui changera la stratégie de remplissage du compilateur.
NathanOliver
@ NathanOliver-ReinstateMonica, je ne le savais pas. Avez-vous une référence à la section pertinente à portée de main par hasard?
R Sahu
@RSahu Je cherche pour mettre ma réponse serrée maintenant.
NathanOliver

Réponses:

8

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:

Un POD-struct est une classe agrégée qui n'a pas de membres de données non statiques de type non-POD-struct, non-POD-union (ou tableau de ces types) ou référence, et n'a pas d'opérateur d'affectation de copie défini par l'utilisateur et pas destructeur défini par l'utilisateur.

Être une classe POD désactive la réutilisation du rembourrage de queue :

Les valeurs dsize, nvsize et nvalign de ces types sont définies comme étant leur taille et leur alignement ordinaires. Ces propriétés ne concernent que les types de classe non vides qui sont utilisés comme classes de base. Nous ignorons le rembourrage de queue pour les POD car une première version de la norme ne nous permettait pas de l'utiliser pour autre chose et parce qu'elle permet parfois une copie plus rapide du type.

Ainsi, dans votre premier exemple, ce An'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é.

TC
la source