In article <
87haq8l...@izac.org>, Benoit Izac <
benoi...@free.fr> wrote:
>Je comprends le probl�me pour les structures (�a a �t� discut� dans fclc
>il y a quelques temps). En revanche, ne connaissant pas C++, je me dis
>qu'il doit y avoir une raison pour choisir un classe plut�t qu'une
>structure.
Benoit, je t'aime bien, mais dans ce cas-la precise que tu es un gros
debutant, ca evitera de rajouter du bruit...
Alors, voila. class et struct, pour des definitions de structure, c'est
la meme chose en C++. Le seul point qui change, c'est la visibilite
par defaut des membres de l'agregat (avec class, ils sont private. Avec
struct, ils sont publics).
Cote layout memoire, c'est comme du C, dans la mesure ou ca a un sens!
Il y a une description assez simple dans la norme C++98, et un peu
plus complexe (nettement) dans la norme C++2011.
En simplifiant, l'esprit c'est que tu n'es pas cense payer plus cher en
C++ qu'en C. Du coup, s'il n'y a pas de fonctionnalite supplementaire
du C++, qui necessite une vtable, une structure C++ va faire exactement
la meme taille que la structure equivalente C, et avoir le meme layout.
Si ta classe n'a que des champs fonction non polymorphes (rien de virtual),
alors elle n'a rien besoin de stocker pour ceux-ci. Des qu'il y a du
polymorphisme (virtual), il faut des infos cachees pour retrouver les
methodes. Traditionnellement, vtable... ca se complique en presence
d'heritage, avec plein, plein d'optimisations sophistiquees sur les
implementations recentes.
Dans la nouvelle norme, on detaille en plus le processus de construction
des instances, sachant qu'une struct "sans rien" se construit et se copie
a la main, mais que ca se complique des qu'il y a constructeurs ou destructeurs.
Plus exactement, la nouvelle norme explique plus en detail:
- les cas ou le layout d'une instance C++ est le meme que pour la struct C
equivalente.
- les cas ou on peut joyeusement copier des objets d'un endroit a l'autre
bit-a-bit, a la meme copie.
Une 'chtite particularite du C++, c'est la tres fameuse
"Empty base optimisation".
Comme en C, une struct, meme vide, DOIT faire au moins un octet.
Du coup, si on fait des trucs composites, genre:
struct A {};
struct B {
A a;
...
};
alors le champs a doit occuper au moins un octet.
Alors que si on fait pareil en heritant:
struct Bp: public A {
...
};
ben la classe de base A peut totalement etre optimisee.
(evidemment, une struct sans rien ne sert a rien... ca va etre utile uniquement
pour recuperer les fonctions membres qui vont avec).
Voila pour un petit resume sommaire des differences saillantes avec C
cote disposition memoire.