Le compilateur génére automatiquement certains opérateurs par défaut
pour les classes qui ne le font pas automatiquement.
Sauf erreur de ma part, il s'agit de:
- constructeur par défaut (Classe::Classe())
- constructeur de recopie (Classe::Classe(const Class&))
- affectation (Classe::operator = (const Classe&))
Pourquoi n'est-il pas prévu qu'il fasse de même pour l'opérateur (par
exemple) de comparaison (==)?
L'implémentation naturelle serait de considérer ses attributs un à un,
tout comme pour la recopie.
Y a-t'il une raison?
donc memcmp fonctionne très bien sur un double, merci pour cette confirmation.
Un NaN n'est JAMAIS égal à quoi que ce soit, y compris à lui-même. Autrement dit, dans ce cas, memcmp se trompe...
Arnaud
Marc Boyer
Le 06-09-2006, Sylvain a écrit :
Olivier Croquette wrote on 06/09/2006 08:25:
Sylvain wrote:
je ne suis pas tout à fait d'accord avec cette "vision": le compilo ne connait, ni ne "voit", tous les membres consciemment.
Dans le cas d'une classe, comme expliques-tu alors la recopie membre-à-membre (avec appel aux opérateurs de recopie de ses attributs par défauts OU redéfinis) que le compilo met en place?
si un opérateu r de copie existe (est défini par l'auteur) il est utilisé, sinon c'est un memcpy !! ni plus, ni moins.
btw, c'est ce qui n'explique pas - à mes yeux - les réactions envers un (mauvais) opérateur implicite basé sur memcmp; l' "intelligence" de l'opération serait semblable.
Hormis: le padding et le cas du NaN. Donc, il serait pire.
on peut avancer que le premier est mauvais est qu'en rajouter du même tonneau serait diabolique, on peut aussi en profiter pour revisiter (autant que faire ce peut) ces 2 aspects.
Compatibilité avec le C...
Marc Boyer -- Si tu peux supporter d'entendre tes paroles Travesties par des gueux pour exciter des sots IF -- Rudyard Kipling (Trad. Paul Éluard)
Le 06-09-2006, Sylvain <noSpam@mail.net> a écrit :
Olivier Croquette wrote on 06/09/2006 08:25:
Sylvain wrote:
je ne suis pas tout à fait d'accord avec cette "vision": le compilo ne
connait, ni ne "voit", tous les membres consciemment.
Dans le cas d'une classe, comme expliques-tu alors la recopie
membre-à-membre (avec appel aux opérateurs de recopie de ses attributs
par défauts OU redéfinis) que le compilo met en place?
si un opérateu r de copie existe (est défini par l'auteur) il est
utilisé, sinon c'est un memcpy !! ni plus, ni moins.
btw, c'est ce qui n'explique pas - à mes yeux - les réactions envers un
(mauvais) opérateur implicite basé sur memcmp; l' "intelligence" de
l'opération serait semblable.
Hormis: le padding et le cas du NaN.
Donc, il serait pire.
on peut avancer que le premier est mauvais est qu'en rajouter du même
tonneau serait diabolique, on peut aussi en profiter pour revisiter
(autant que faire ce peut) ces 2 aspects.
Compatibilité avec le C...
Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)
je ne suis pas tout à fait d'accord avec cette "vision": le compilo ne connait, ni ne "voit", tous les membres consciemment.
Dans le cas d'une classe, comme expliques-tu alors la recopie membre-à-membre (avec appel aux opérateurs de recopie de ses attributs par défauts OU redéfinis) que le compilo met en place?
si un opérateu r de copie existe (est défini par l'auteur) il est utilisé, sinon c'est un memcpy !! ni plus, ni moins.
btw, c'est ce qui n'explique pas - à mes yeux - les réactions envers un (mauvais) opérateur implicite basé sur memcmp; l' "intelligence" de l'opération serait semblable.
Hormis: le padding et le cas du NaN. Donc, il serait pire.
on peut avancer que le premier est mauvais est qu'en rajouter du même tonneau serait diabolique, on peut aussi en profiter pour revisiter (autant que faire ce peut) ces 2 aspects.
Compatibilité avec le C...
Marc Boyer -- Si tu peux supporter d'entendre tes paroles Travesties par des gueux pour exciter des sots IF -- Rudyard Kipling (Trad. Paul Éluard)
Franck Branjonneau
Olivier Croquette écrivait:
Mais en ce qui me concerne, le problème n'est pas tant d'avoir un opérateur *implicite* de comparaison membre à membre, mais d'en avoir un tout court.
btw, c'est ce qui n'explique pas - à mes yeux - les réactions envers un (mauvais) opérateur implicite basé sur memcmp; l' "intelligence" de l'opération serait semblable.
Hormis: le padding et le cas du NaN. Donc, il serait pire.
- on a déjà indiqué que le problème du padding peut être réglé par une mise à zéro de toute la zone mémoire de la struct avant la recopie.
ensuite que la copie utilise des registres de taille identique aux argument ou des multiples (32 ou 64 bits) égaux à l'alignement, elle n'empêchera pas une comparaison bit à bit.
- NaN n'est pas une valeur, donc rappeler que NaN n'est pas unique était une porte ouverte; par contre ayant un entier évalué comme NaN (par _isnan) sa copie par memcmp sera également évaluée comme NaN.
Sylvain.
Marc Boyer wrote on 06/09/2006 14:24:
btw, c'est ce qui n'explique pas - à mes yeux - les réactions envers un
(mauvais) opérateur implicite basé sur memcmp; l' "intelligence" de
l'opération serait semblable.
Hormis: le padding et le cas du NaN.
Donc, il serait pire.
- on a déjà indiqué que le problème du padding peut être réglé par une
mise à zéro de toute la zone mémoire de la struct avant la recopie.
ensuite que la copie utilise des registres de taille identique aux
argument ou des multiples (32 ou 64 bits) égaux à l'alignement, elle
n'empêchera pas une comparaison bit à bit.
- NaN n'est pas une valeur, donc rappeler que NaN n'est pas unique était
une porte ouverte; par contre ayant un entier évalué comme NaN (par
_isnan) sa copie par memcmp sera également évaluée comme NaN.
btw, c'est ce qui n'explique pas - à mes yeux - les réactions envers un (mauvais) opérateur implicite basé sur memcmp; l' "intelligence" de l'opération serait semblable.
Hormis: le padding et le cas du NaN. Donc, il serait pire.
- on a déjà indiqué que le problème du padding peut être réglé par une mise à zéro de toute la zone mémoire de la struct avant la recopie.
ensuite que la copie utilise des registres de taille identique aux argument ou des multiples (32 ou 64 bits) égaux à l'alignement, elle n'empêchera pas une comparaison bit à bit.
- NaN n'est pas une valeur, donc rappeler que NaN n'est pas unique était une porte ouverte; par contre ayant un entier évalué comme NaN (par _isnan) sa copie par memcmp sera également évaluée comme NaN.
Sylvain.
Gabriel Dos Reis
Sylvain writes:
| Franck Branjonneau wrote on 02/09/2006 23:36: | > | >> "==" est univoque | > Non. | | tu fais bien de ne pas détailler, ça évite les bourdes. | (si '0' n'est plus égal à '0' et '1' à '1' on cours au pb).
volatile int x = 0;
assert (x == x);
?
-- Gaby
Sylvain <noSpam@mail.net> writes:
| Franck Branjonneau wrote on 02/09/2006 23:36:
| >
| >> "==" est univoque
| > Non.
|
| tu fais bien de ne pas détailler, ça évite les bourdes.
| (si '0' n'est plus égal à '0' et '1' à '1' on cours au pb).
| Franck Branjonneau wrote on 02/09/2006 23:36: | > | >> "==" est univoque | > Non. | | tu fais bien de ne pas détailler, ça évite les bourdes. | (si '0' n'est plus égal à '0' et '1' à '1' on cours au pb).
volatile int x = 0;
assert (x == x);
?
-- Gaby
Gabriel Dos Reis
Sylvain writes:
| btw, la question ne portait pas sur la possibilité de "détourner" cet | opérateur, mais voulait utiliser son acceptation première.
qui est ?
-- Gaby
Sylvain <noSpam@mail.net> writes:
| btw, la question ne portait pas sur la possibilité de "détourner" cet
| opérateur, mais voulait utiliser son acceptation première.
| btw, la question ne portait pas sur la possibilité de "détourner" cet | opérateur, mais voulait utiliser son acceptation première.
qui est ?
-- Gaby
Gabriel Dos Reis
Olivier Croquette writes:
[...]
| Mais en ce qui me concerne, le problème n'est pas tant d'avoir un | opérateur *implicite* de comparaison membre à membre, mais d'en avoir | un tout court.
En effet.
Nous avons pensé au problème en long, en large, et en travers. Il y a puet-être une solution, mais il faudra attendre 2010 ou plus.
| Mais en ce qui me concerne, le problème n'est pas tant d'avoir un
| opérateur *implicite* de comparaison membre à membre, mais d'en avoir
| un tout court.
En effet.
Nous avons pensé au problème en long, en large, et en travers. Il y a
puet-être une solution, mais il faudra attendre 2010 ou plus.
| Mais en ce qui me concerne, le problème n'est pas tant d'avoir un | opérateur *implicite* de comparaison membre à membre, mais d'en avoir | un tout court.
En effet.
Nous avons pensé au problème en long, en large, et en travers. Il y a puet-être une solution, mais il faudra attendre 2010 ou plus.
-- Gaby
Gabriel Dos Reis
Sylvain writes:
| Olivier Croquette wrote on 04/09/2006 22:47: | > Bref, il n'y a pas d'opérateur de comparaison membre à membre | > valable dans la plupart des applications courantes. | > | votre énoncé est contradictoire! | | une solution "valable pour la plupart des cas" impose un traitement | générique (comme un memcmp sur la taille de la struct).
?
-- Gaby
Sylvain <noSpam@mail.net> writes:
| Olivier Croquette wrote on 04/09/2006 22:47:
| > Bref, il n'y a pas d'opérateur de comparaison membre à membre
| > valable dans la plupart des applications courantes.
| >
| votre énoncé est contradictoire!
|
| une solution "valable pour la plupart des cas" impose un traitement
| générique (comme un memcmp sur la taille de la struct).
| Olivier Croquette wrote on 04/09/2006 22:47: | > Bref, il n'y a pas d'opérateur de comparaison membre à membre | > valable dans la plupart des applications courantes. | > | votre énoncé est contradictoire! | | une solution "valable pour la plupart des cas" impose un traitement | générique (comme un memcmp sur la taille de la struct).
?
-- Gaby
Gabriel Dos Reis
Sylvain writes:
| Olivier Croquette wrote on 05/09/2006 20:14: | >> | >> une comparaison membre-à-membre est nécessairement un opérateur | >> défini par l'auteur (et même une macro de l'éditeur suppose une | >> action du codeur). | > Non, non et non, justement. | > Le compilateur connait les membres automatiquement, et pourrait | > mettre à disposition un opérateur de comparaison membre à membre, | > tout comme il le fait déjà pour l'opérateur de recopie. | | je ne suis pas tout à fait d'accord avec cette "vision": le compilo ne | connait, ni ne "voit", tous les membres consciemment.
ah bon ? C'est lr principe de Sylvain ?
-- Gaby
Sylvain <noSpam@mail.net> writes:
| Olivier Croquette wrote on 05/09/2006 20:14:
| >>
| >> une comparaison membre-à-membre est nécessairement un opérateur
| >> défini par l'auteur (et même une macro de l'éditeur suppose une
| >> action du codeur).
| > Non, non et non, justement.
| > Le compilateur connait les membres automatiquement, et pourrait
| > mettre à disposition un opérateur de comparaison membre à membre,
| > tout comme il le fait déjà pour l'opérateur de recopie.
|
| je ne suis pas tout à fait d'accord avec cette "vision": le compilo ne
| connait, ni ne "voit", tous les membres consciemment.
| Olivier Croquette wrote on 05/09/2006 20:14: | >> | >> une comparaison membre-à-membre est nécessairement un opérateur | >> défini par l'auteur (et même une macro de l'éditeur suppose une | >> action du codeur). | > Non, non et non, justement. | > Le compilateur connait les membres automatiquement, et pourrait | > mettre à disposition un opérateur de comparaison membre à membre, | > tout comme il le fait déjà pour l'opérateur de recopie. | | je ne suis pas tout à fait d'accord avec cette "vision": le compilo ne | connait, ni ne "voit", tous les membres consciemment.
ah bon ? C'est lr principe de Sylvain ?
-- Gaby
Gabriel Dos Reis
Sylvain writes:
| Marc Boyer wrote on 06/09/2006 14:24: | >> | >> btw, c'est ce qui n'explique pas - à mes yeux - les réactions | >> envers un (mauvais) opérateur implicite basé sur memcmp; l' | >> "intelligence" de l'opération serait semblable. | > Hormis: le padding et le cas du NaN. | > Donc, il serait pire. | | - on a déjà indiqué que le problème du padding peut être réglé par une | mise à zéro de toute la zone mémoire de la struct avant la recopie.
Pourquoi ?
-- Gaby
Sylvain <noSpam@mail.net> writes:
| Marc Boyer wrote on 06/09/2006 14:24:
| >>
| >> btw, c'est ce qui n'explique pas - à mes yeux - les réactions
| >> envers un (mauvais) opérateur implicite basé sur memcmp; l'
| >> "intelligence" de l'opération serait semblable.
| > Hormis: le padding et le cas du NaN.
| > Donc, il serait pire.
|
| - on a déjà indiqué que le problème du padding peut être réglé par une
| mise à zéro de toute la zone mémoire de la struct avant la recopie.
| Marc Boyer wrote on 06/09/2006 14:24: | >> | >> btw, c'est ce qui n'explique pas - à mes yeux - les réactions | >> envers un (mauvais) opérateur implicite basé sur memcmp; l' | >> "intelligence" de l'opération serait semblable. | > Hormis: le padding et le cas du NaN. | > Donc, il serait pire. | | - on a déjà indiqué que le problème du padding peut être réglé par une | mise à zéro de toute la zone mémoire de la struct avant la recopie.