2013-02-22 16 views
12

Ho creato una classe X avendo solo 2 funzioni pubbliche (costruttore e distruttore), e utilizzando sizeof all'operatore la dimensione della classe sta per essere 1.Come calcola le dimensioni l'operatore C++ sizeof?

Quando aggiungo un membro di dati privati ​​di tipo char alla dichiarazione classe superiore , la dimensione è ancora 1. Infine aggiungo un tipo intero ad esso come membro di dati di classe, e ora la dimensione è di 8 byte.

Gentilmente spiegami come viene calcolata una dimensione della classe.

+0

Si prega di inviare il codice relativo. –

risposta

23

Innanzitutto, rendersi conto che le funzioni che non sono virtuali non hanno alcun effetto sulle dimensioni di una classe.

La dimensione di un'istanza di qualsiasi classe è di almeno 1 byte, anche se la classe è vuota, in modo che oggetti diversi abbiano indirizzi diversi.

L'aggiunta di un char assicura che diversi oggetti abbiano indirizzi diversi, pertanto il compilatore non ne aggiunge artificialmente uno alla dimensione. La dimensione è quindi sizeof(char) = 1.

Quindi si aggiunge uno int, che (probabilmente) aggiunge 4 byte sulla piattaforma. Il compilatore decide quindi di eseguire il pad della classe in modo che sia allineato per motivi di prestazioni/requisiti della CPU e aggiunge 3 byte vuoti in modo che la dimensione sia ora 1 + 3 + 4 = 8. Probabilmente aggiunge il padding prima del membro int così che sarà allineato su un limite di 4 byte, ma non è richiesto a meno che la tua CPU lo richieda.

È possibile leggere informazioni sul riempimento su the Wikipedia page.

+2

Mi aspetterei che sia 'c --- iiii' piuttosto che' ciiii --- ', come implica questa risposta. – zch

+4

@zch Non volevo sottintendere che dal momento che dipende dal compilatore. Ma cambierò l'ordine dell'aggiunta e aggiungerò una nota se la farà sembrare meno confusa. –

+0

grazie mille @SethCarnegie per la spiegazione. Conosco un po 'il padding, lo scaverò più a fondo in esso perché dubito che non ci sia il padding quando viene dichiarato un solo char, anche quando il limite è di 4 byte. :) – user2100866

8

Ci sono molti fattori che determinano la dimensione di un oggetto di una classe in C++. Questi fattori sono:

  1. Dimensione di tutti i membri di dati non statici
  2. Ordine dei membri di dati
  3. Byte allineamento o byte imbottitura
  4. dimensioni della sua classe base immediata
  5. L'esistenza di funzione virtuale (s) (polimorfismo dinamico che utilizza funzioni virtuali).
  6. compilatore utilizzato
  7. modalità di trasmissione (eredità virtuale)

È possibile trovare maggiori qui http://www.cprogramming.com/tutorial/size_of_class_object.html