Perché la dimensione della classe in c ++ dipende dallo stato pubblico / privato dei membri dei dati?


23

Da quello che so, la dimensione di una classe in c ++ dipende dai seguenti fattori:

  1. Dimensione di tutti i membri di dati non statici.
  2. Ordine dei membri dei dati.
  3. Se il riempimento di byte è abilitato o meno.
  4. Dimensione della sua classe base immediata.
  5. L'esistenza di funzioni virtuali.
  6. Modalità di eredità (eredità virtuale).

Ora ho creato 2 classi come di seguito -

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;  
};

ora sul controllo delle dimensioni di A e BI vedere

  • dimensione di A: 16
  • dimensione della B: 16

la mia ipotesi è che il carattere c nella classe B sia alloggiato nella "buca" lasciata nella classe A.

Ma ciò che mi ha confuso è lo scenario seguente in cui pubblico i membri

class A{
    public:
    int a;
    short d;
    int b;
    char s;
};

class B : public A{
    public:
    char c;
};

Ora la dimensione diventa

  • dimensione di A: 16
  • dimensione della B: 20

Non riesco a capire il motivo di questa differenza.


1
Perché la dimensione della classe in c ++ dipende dallo stato pubblico / privato dei membri dei dati? - Non lo fa. Questi sono dettagli di implementazione dipendenti dal compilatore.
PaulMcKenzie,

1
Quindi quale compilatore stai usando?
Romen,

2
@PaulMcKenzie In realtà lo fa. I mandati standard membri con lo stesso accesso vengono raggruppati in modo tale da cambiare la strategia di riempimento del compilatore.
NathanOliver,

@ NathanOliver-ReinstateMonica, non lo sapevo. Hai un riferimento alla sezione pertinente utile per caso?
R Sahu,

@RSahu Alza lo sguardo per inserire subito la mia risposta.
NathanOliver,

Risposte:


8

L'ABI Itanium utilizza la definizione C ++ 03 di POD per definire le classi che sono "POD ai fini del layout". La presenza di membri di dati privati ​​esclude una classe dall'essere un aggregato e quindi POD in C ++ 03:

Una POD-struct è una classe aggregata che non ha membri di dati non statici di tipo non-POD-struct, non-POD-union (o array di tali tipi) o di riferimento e non ha un operatore di assegnazione della copia definito dall'utente e nessun distruttore definito dall'utente.

Essere una classe POD disabilita il riutilizzo dell'imbottitura della coda :

Dsize, nvsize e nvalign di questi tipi sono definiti come dimensioni e allineamento ordinari. Queste proprietà sono importanti solo per i tipi di classe non vuoti utilizzati come classi di base. Ignoriamo il padding di coda per i POD perché una prima versione dello standard non ci permetteva di usarlo per nient'altro e perché a volte consente una copia più veloce del tipo.

Pertanto, nel tuo primo esempio, Anon è un POD per scopi di layout e la sua imbottitura di coda può essere utilizzata per B::c, ma nel tuo secondo esempio, è un POD e la sua imbottitura di coda non può essere riutilizzata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.