 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Stan Guest
|
Posted: Thu Sep 15, 2005 8:10 am Post subject: supression d'un private... |
|
|
Une reflexion à propos de la question posée précédemment sur
l'incidence de la supression d'un private dans un source.
La question d'origine était : Est-ce que le fait de supprimer
un ou plusieurs "private" peut modifier le comportement du programme ?
Dans le cas en question, sans doute pas, mais il est des cas...
Par exemple en modifiant le type d"héritage.
La plupart des compilateurs utilisent l'EBO ( Empty Base Optimization ), et
il
s'avère que dans le cas d'un héritage privé d'une classe vide :
class Nutshell { };
, l'EBO peut s'effectuer. Donc, dans la pratique, la taille du code généré
peut varier
selon le type d'héritage ( ...d'une classe vide ).
En résumé,
class A : private Nutshell
{
private:
int Value;
};
peut avoir une taille différente de :
class A : public Nutshell
{
private:
int Value;
};
Si le code effectue des tests sur la taille de la classe :
if( sizeof( A ) > otherclass ) ... //
cela peut modifier le comportement du programme à l'execution !
Je sais, c'est tordu
Et d'ailleurs, mon raisonnement est-il correct ?
--
-Stan
|
|
| Back to top |
|
 |
Arnaud Meurgues Guest
|
Posted: Thu Sep 15, 2005 8:39 am Post subject: Re: supression d'un private... |
|
|
Stan wrote:
| Quote: | Si le code effectue des tests sur la taille de la classe :
if( sizeof( A ) > otherclass ) ... //
cela peut modifier le comportement du programme à l'execution !
Je sais, c'est tordu
Et d'ailleurs, mon raisonnement est-il correct ?
|
De toute façon, la taille d'une classe n'est pas garantie par la norme.
Par conséquent, ce genre de code n'est pas portable, ni déterministe (à
par avec une version donnée d'un compilateur sur une plateforme donnée,
à la rigueur).
Donc, il ne faut pas s'étonner si son comportement varie en fonction du
vent et de la pluie, non ?
--
Arnaud
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Thu Sep 15, 2005 8:45 am Post subject: Re: supression d'un private... |
|
|
Stan a écrit :
| Quote: | Une reflexion à propos de la question posée précédemment sur
l'incidence de la supression d'un private dans un source.
La question d'origine était : Est-ce que le fait de supprimer
un ou plusieurs "private" peut modifier le comportement du programme ?
Dans le cas en question, sans doute pas, mais il est des cas...
Par exemple en modifiant le type d"héritage.
La plupart des compilateurs utilisent l'EBO ( Empty Base Optimization ), et
il
s'avère que dans le cas d'un héritage privé d'une classe vide :
class Nutshell { };
, l'EBO peut s'effectuer.
|
Qu'est-ce qui empêche l'EBO de s'appliquer pour de l'héritage public ?
--
Loïc
|
|
| Back to top |
|
 |
Bertrand Lenoir-Welter Guest
|
Posted: Thu Sep 15, 2005 10:08 am Post subject: Re: supression d'un private... |
|
|
Stan :
| Quote: | Si le code effectue des tests sur la taille de la classe :
if( sizeof( A ) > otherclass ) ... //
cela peut modifier le comportement du programme à l'execution !
|
Si ma tante en avait...
| Quote: | Je sais, c'est tordu
|
Me voilà rassuré. Etes-vous prêt à déclarer sur l'honneur que vous
seriez capable de coder un truc comme ça dans un programme sérieux ?
| Quote: | Et d'ailleurs, mon raisonnement est-il correct ?
|
Je ne vois guère que deux int à comparer... Mais ça doit dépendre de
l'humeur du compilo ou plutôt de ceux qui l'ont réalisé. J'avoue n'avoir
probablement jamais eu à utiliser un sizeof global pour une classe. Mais
je vais quand même essayer sur le mien, tenez !
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Thu Sep 15, 2005 10:14 am Post subject: Re: supression d'un private... |
|
|
"Arnaud Meurgues" <news.arnaud (AT) meurgues (DOT) non.fr.invalid> a écrit dans le
message de news: 4329333f$0$1918$626a14ce (AT) news (DOT) free.fr...
| Quote: | Stan wrote:
Si le code effectue des tests sur la taille de la classe :
if( sizeof( A ) > otherclass ) ... //
cela peut modifier le comportement du programme à l'execution !
Je sais, c'est tordu
Et d'ailleurs, mon raisonnement est-il correct ?
De toute façon, la taille d'une classe n'est pas garantie par la norme.
|
Y a quand même des évidences :
class A{
char x;
};
class B{
int x;
long z;
long v;
long u;
};
if( sizeof( B) > sizeof( A) ) std::cout << "oops" << endl;
| Quote: | Par conséquent, ce genre de code n'est pas portable, ni déterministe (à
par avec une version donnée d'un compilateur sur une plateforme donnée,
à la rigueur).
|
La portabilité n'est pas toujours un pré-requis.
| Quote: | Donc, il ne faut pas s'étonner si son comportement varie en fonction du
vent et de la pluie, non ?
|
Exagérer n'a jamais rendu plus crédible.
--
-Stan
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Sep 15, 2005 10:39 am Post subject: Re: supression d'un private... |
|
|
On Thu, 15 Sep 2005 12:14:09 +0200, "Stan" <z.y.l.o.g (AT) wanadoo (DOT) fr (
remove the dots )>:
| Quote: | De toute façon, la taille d'une classe n'est pas garantie par la norme.
Y a quand même des évidences :
|
Pour les POD, je crois que la situation est différente.
Et de toutes façons, la norme est une chose, les implémentations
usuelles, une autre.
Pour prendre l'exemple classique, jusqu'à assez récemment, la norme
n'imposait pas que les éléments d'un vector<> soient contigus,
pourtant c'était le cas dans toutes les implémentations.
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Thu Sep 15, 2005 1:32 pm Post subject: Re: supression d'un private... |
|
|
Fabien LE LEZ wrote:
| Quote: | On Thu, 15 Sep 2005 12:14:09 +0200, "Stan"
[email]z.y.l.o.g (AT) wanadoo (DOT) fr[/email] ( remove the dots )>:
De toute façon, la taille d'une classe n'est pas garantie
par la norme.
Y a quand même des évidences :
Pour les POD, je crois que la situation est différente.
|
Oui et non. Dans la mesure où les POD doivent être compatible
avec le C, et qu'en C, on a la notion des types compatible,
peut-être.
En revanche, la taille d'un POD peut bien varier selon les
options de compilation, sans parler de la version du
compilateur, le compilateur même, et la machine.
| Quote: | Et de toutes façons, la norme est une chose, les
implémentations usuelles, une autre.
|
Toutes les implémentations que je connais ont des options pour
varier le packing.
| Quote: | Pour prendre l'exemple classique, jusqu'à assez récemment, la
norme n'imposait pas que les éléments d'un vector<> soient
contigus, pourtant c'était le cas dans toutes les
implémentations.
|
C'est un autre problème. Même aujourd'hui, la norme permet du
rembourrage entre des différents membres d'une classe, et dans
la pratique, les compilateurs varient en ce qui concerne leur
politique là-dessus.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Thu Sep 15, 2005 1:36 pm Post subject: Re: supression d'un private... |
|
|
Stan ( remove the dots ) wrote:
| Quote: | Une reflexion à propos de la question posée précédemment sur
l'incidence de la supression d'un private dans un source.
La question d'origine était : Est-ce que le fait de supprimer
un ou plusieurs "private" peut modifier le comportement du
programme ?
Dans le cas en question, sans doute pas, mais il est des
cas... Par exemple en modifiant le type d"héritage.
La plupart des compilateurs utilisent l'EBO ( Empty Base
Optimization ), et il s'avère que dans le cas d'un héritage
privé d'une classe vide :
class Nutshell { };
, l'EBO peut s'effectuer.
|
De même que dans le cas d'un héritage public.
| Quote: | Donc, dans la pratique, la taille du code généré peut varier
selon le type d'héritage ( ...d'une classe vide ).
|
C'est aussi peu probable que de faire dépendre le EBO sur la
première lettre du nom de la classe : on l'applique si le nom de
la classe commence par un majuscule, non si c'est un minuscule.
C'est permis, mais je vois mal une implémentation le faire.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Arnaud Meurgues Guest
|
Posted: Fri Sep 16, 2005 8:41 am Post subject: Re: supression d'un private... |
|
|
Stan wrote:
| Quote: | Par conséquent, ce genre de code n'est pas portable, ni déterministe (à
par avec une version donnée d'un compilateur sur une plateforme donnée,
à la rigueur).
La portabilité n'est pas toujours un pré-requis.
|
Non. Mais le déterminisme est préférable.
| Quote: | Donc, il ne faut pas s'étonner si son comportement varie en fonction du
vent et de la pluie, non ?
Exagérer n'a jamais rendu plus crédible.
|
La muflerie non plus.
--
Arnaud
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Fri Sep 16, 2005 8:56 am Post subject: Re: supression d'un private... |
|
|
"Arnaud Meurgues" <news.arnaud (AT) meurgues (DOT) non.fr.invalid> a écrit dans le
message de news: 432a8517$0$7948$626a14ce (AT) news (DOT) free.fr...
| Quote: | Stan wrote:
Par conséquent, ce genre de code n'est pas portable, ni déterministe (à
par avec une version donnée d'un compilateur sur une plateforme donnée,
à la rigueur).
La portabilité n'est pas toujours un pré-requis.
Non. Mais le déterminisme est préférable.
Donc, il ne faut pas s'étonner si son comportement varie en fonction du
vent et de la pluie, non ?
Exagérer n'a jamais rendu plus crédible.
La muflerie non plus.
|
L'éxagération est une habitude chez toi.
--
-Stan
|
|
| Back to top |
|
 |
Bertrand Lenoir-Welter Guest
|
Posted: Fri Sep 16, 2005 9:06 am Post subject: Re: supression d'un private... |
|
|
Pour info, j'ai essayé la chose suivante (Borland C++ 5.02) :
class C1: public C0
{
public:
int i;
};
class C2: private C0
{
public:
int i;
};
class C3: public C0
{
private:
int i;
};
class C4: private C0
{
private:
int i;
};
sizeof(Cn) me renvoie la même taille (C0 + int) dans les 4 cas.
Je suis pas allé voir dans l'assembleur pour chercher d'éventuelles
différences, mais je parie une boîte de cassoulet qu'y'en a pas.
|
|
| Back to top |
|
 |
Laurent Deniau Guest
|
Posted: Fri Sep 16, 2005 9:38 am Post subject: Re: supression d'un private... |
|
|
Bertrand Lenoir-Welter wrote:
| Quote: | Pour info, j'ai essayé la chose suivante (Borland C++ 5.02) :
class C1: public C0
{
public:
int i;
};
class C2: private C0
{
public:
int i;
};
class C3: public C0
{
private:
int i;
};
class C4: private C0
{
private:
int i;
};
sizeof(Cn) me renvoie la même taille (C0 + int) dans les 4 cas.
Je suis pas allé voir dans l'assembleur pour chercher d'éventuelles
différences, mais je parie une boîte de cassoulet qu'y'en a pas.
|
Parce que C1, C2, C3 et C4 ne sont pas polymorphique. S'ils le sont, le
layout ne changera probablement pas, mais le comportement de
dynamic_cast oui.
a+, ld.
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Fri Sep 16, 2005 12:06 pm Post subject: Re: supression d'un private... |
|
|
"Bertrand Lenoir-Welter" <bertrand.2004 (AT) galaad (DOT) net> a écrit dans le message
de news: 4329481a$0$17240$8fcfb975 (AT) news (DOT) wanadoo.fr...
| Quote: | Si ma tante en avait...
|
Très constructif.
| Quote: | Je sais, c'est tordu ;-)
Me voilà rassuré. Etes-vous prêt à déclarer sur l'honneur que vous seriez
capable de coder un truc comme ça dans un programme sérieux ?
|
Comme l'indiquait le post, il s'agissait d'une reflexion :
le genre de curiosités intelletuelles qui sont plus annecdotiques
qu'utiles.
Vous me semblez un peu aigris.
--
-Stan
|
|
| Back to top |
|
 |
Arnaud Meurgues Guest
|
Posted: Fri Sep 16, 2005 12:37 pm Post subject: Re: supression d'un private... |
|
|
Stan wrote:
| Quote: | L'éxagération est une habitude chez toi.
|
exemples ?
--
Arnaud
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Fri Sep 16, 2005 12:41 pm Post subject: Re: supression d'un private... |
|
|
"Arnaud Meurgues" <news.arnaud (AT) meurgues (DOT) non.fr.invalid> a écrit dans le
message de news: 432abc94$0$14568$636a55ce (AT) news (DOT) free.fr...
| Quote: | Stan wrote:
L'éxagération est une habitude chez toi.
exemples ?
|
| Quote: | Donc, il ne faut pas s'étonner si son comportement varie en fonction du
vent et de la pluie, non ?
|
A mon goût.
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|