2010-05-07 12 views
10

Supponiamo che io sono:C++ oggetto dimensioni

struct Foo: public Bar { 
.... 
} 

Foo introduce nessun nuovo membro varaibles. Foo introduce solo alcune funzioni membro & funzioni statiche. Qualunque parte dello standard C++ ora garantisce che:

sizeof(Foo) == sizeof(Bar) 

?

Grazie!

+0

Si noti inoltre che il 'Bar' tha t è contenuto in 'Foo' può avere una dimensione diversa da' Bar' non contenuta in un 'Foo'. Ad esempio, un'ottimizzazione comune consiste nel fare in modo che le classi di base abbiano la dimensione zero se sono vuote, ma diverse da zero se non sono contenute come classi base (come richiesto da C++). –

risposta

11

potrei pensare di almeno uno scenario in cui sizeof(Foo) != sizeof(Bar):

class Bar { 
public: 
int m_member; 
}; 

class Foo : Bar { 
    virtual ~Foo(); 
}; 

Foo avrà un puntatore vtable mentre Bar non lo farebbe e la dimensione del primo sarà più grande di una parola rispetto a Bar. Su 32bit DEBUG MSVC2010:

sizeof(Foo) - 8 
sizeof(Bar) - 4 

EDIT Questo vale per le strutture così come le classi, ho reran il test per confermare che.

+0

@Betamoo: mi piacerebbe conoscere le differenze e il modo in cui si riferiscono a questa risposta. – tiftik

+5

In C++, l'unica differenza tra struct's e class è l'ambito di accesso predefinito. - con una aggiunta, anche se non ha molta importanza, la lingua richiede di fare riferimento allo stesso costrutto in modo coerente. Non puoi dichiarare "classe Foo", quindi "struct Foo". Almeno, se lo fai, assumerai che sono uguali e (di solito) mettono in guardia sulle dichiarazioni incoerenti. –

+3

@Betamoo: il C++ non ha "strutture". Tutto è una classe, anche se è dichiarata con la parola chiave 'struct'. – AnT

2

Certamente no, soprattutto se una delle funzioni di una delle classi è virtual. Mentre lo standard C++ non garantisce questo, con funzioni virtuali sarebbe quasi certamente cambiare la dimensione degli oggetti (a causa del v-tabelle.)

+0

ma sta parlando di struct not classes .. – Betamoo

+9

Le strutture sono le stesse delle classi in C++, l'unica differenza è che l'accesso predefinito è pubblico, non privato. –

5

Sì, se sono tipi POD. I tipi di POD sono garantiti per essere compatibili con il layout (ovvero puoi memcpy da uno all'altro) se hanno membri compatibili con il layout nello stesso ordine. Dal momento che una sottoclasse ha automaticamente tutti i membri della sua classe base nello stesso ordine e, in questo caso, nessun altro, saranno compatibili con il layout e quindi della stessa dimensione. Vedere la sezione 9.3 delle specifiche.

Si noti che, per essere tipi POD devono avere funzioni virtuali (tra gli altri requisiti)

EDIT

L'ultimo progetto di norma ha diviso i requisiti per i tipi di POD in due gruppi: banali classi e classi standard. POD classi sono quelli che sono entrambi banali e layout standard, e credo che per il guarentee sizeof che si desidera, solo di essere layout standard sono sufficienti - hanno bisogno di non essere anche banale (e quindi POD) classi. I requisiti per layout standard dalla specifica sono:

A standard la layout classe è una classe che:

- ha alcun membri dati non statici della classe tipo non standard layout (o array di tali tipi) o riferimento,

- non ha funzioni virtuali (10.3) e nessuna classe di base virtuale (10.1),

- ha lo stesso controllo di accesso (Articolo 11) per tutti i membri di dati non statici,

- ha classi di base non standard di layout,

- o non ha mancato membri di dati statici nella classe di maggior derivazione e al massimo una classe di base con membri di dati non statici o senza classi di base con membri di dati non statici e

- non ha classi di base dello stesso tipo di primo membro di dati non statici.108

+0

Non credo che la garanzia valga se ci sono funzioni membro, vero? Certamente l'esempio della classe base senza membri virtuali e la sottoclasse con virtuals suggerirebbe di no. I tipi di POD –

+1

possono avere funzioni membro. Tuttavia non possono avere funzioni membro virtuali. Non sono convinto che un tipo con un tipo di base possa essere considerato un POD, ma può? – Stewart

+1

@Mark, @Stewart: un POD può avere funzioni membro, ma non un ** base, ** costruttore di copia, distruttore, funzione virtuale, membro dati non pubblico o un membro che non rispetta questi requisiti. – Potatoswatter