besoin de testeurs: retour de fonction - C++ - Programmation
Marsh Posté le 25-07-2003 à 23:58:00
VC7 / Release:
Code :
|
Marsh Posté le 26-07-2003 à 00:01:08
fait une recopie en trop je regardes les options d'optimisation...
Marsh Posté le 26-07-2003 à 00:01:54
ouais y a un truc bizarre... voir ce topic http://forum.hardware.fr/forum2.ph [...] h=&subcat=
et les différentes traces...
Marsh Posté le 26-07-2003 à 00:16:52
j'obtiens la meme trace que toi, c'est à dire pour h si je remplace
return tmp;
par
return Foo(tmp);
je me renseigne sur ce comportement...
c'est interessant...
Marsh Posté le 26-07-2003 à 00:35:06
je viens de faire un test avec openwatcom:
Code :
|
Marsh Posté le 26-07-2003 à 00:41:49
VC6 a le même comportement que VC7 (il y a une recopie de trop)
Marsh Posté le 26-07-2003 à 00:44:17
BJOne a écrit : VC6 a le même comportement que VC7 (il y a une recopie de trop) |
le tout est de savoir si c'est vraiment en trop. comme tu peux voir dans l'autre topic, c'est très pénalisant
Marsh Posté le 26-07-2003 à 00:49:03
BJOne a écrit : bin ça casse un peu le truc à la base |
oui, et même pour une expression simple, ça fait un boulot considérable en plus!
Marsh Posté le 26-07-2003 à 10:40:58
la réponse de Jean Marc Bourget sur fclc++
Je suis d'accord avec lui, il s'agit d'une optimisation permise par la norme
Citation : > je me pose des questions sur les retours de fonction et les copies |
Marsh Posté le 15-09-2003 à 15:14:11
Sinon je viens de tester avec VS.NET 2003, le constructeur de recopie en trop y est aussi, avec le compilo Intel C++ 7 c'est bon.
Marsh Posté le 15-09-2003 à 15:29:20
BJOne a écrit : j'ai pas borland c++ 6 d'installé |
moi je l'ai :
|
Marsh Posté le 15-09-2003 à 15:30:05
Le comportement est appelé "return value optimization" et il y a déjà pas mal de discussions sur le sujet ici. L'article le plus complet sur le sujet (et qui relève les contradictions à ce sujet dans l'ARM !) est celui-ci.
Le problème est de savoir si le compilateur peut effectivement se passer de la recopie. Pour cela il faut qu'aucun constructeur n'ait d'effet de bord.
Par exemple :
Code :
|
Ici, il est nécessaire de ne pas faire l'optimisation. En effet, il y a réellement la création d'un objet Foo et ensuite sa recopie. Or à cause de la variable statique, l'appel aux deux constructeurs est obligatoire.
Par contre, si la variable statique numInstances_ n'existait pas, l'optimisation serait justifiée.
Marsh Posté le 15-09-2003 à 16:30:13
(ceux qui ont un compilo optimisant pourrait essayer avec l'exemple de gatorette ?)
Marsh Posté le 15-09-2003 à 16:38:32
je teste comment ? faut mélanger les deux codes source ? (pas envie de chercher là, je veux un truc à copier/coller )
Marsh Posté le 15-09-2003 à 16:41:44
toi tu test rien ton borland optimise pas
(bon si t'as, tu balance le code de gatorette et tu regardes la valeur de la variable statique apres execution, ou tu rajoute un cout<<"kookoo" dans le constructeur)
Marsh Posté le 15-09-2003 à 16:44:51
[Linker Error] Unresolved external '_main' referenced from D:\BORLAND\CBUILDER6\LIB\C0X32.OBJ
Marsh Posté le 15-09-2003 à 16:56:48
numInstances vaut 2
et ton Foo f = f(); il aime pas, vu que f est pas une fonction mais un Foo
Marsh Posté le 15-09-2003 à 16:58:26
la y'a kooye dans gigot
ah ok c reglé
Marsh Posté le 15-09-2003 à 16:58:38
j'ai édité, j'avais mal corrigé ton code
Marsh Posté le 15-09-2003 à 17:30:14
oui, et toi ?
(:heink
Marsh Posté le 15-09-2003 à 17:31:03
ché pas, c'est quoi ces manières de upper au bout de 25 jours?
Marsh Posté le 15-09-2003 à 17:42:20
c'est pas moi qui ai uppé
Marsh Posté le 15-09-2003 à 18:03:16
tiens j'avais meme pas fait gaffe qu'il avait 15ans ce topic
Marsh Posté le 15-09-2003 à 18:16:53
Je n'avais pas vu non plus qu'il datait tant ce topic.
Taz a écrit : la réponse de Jean Marc Bourget sur fclc++ |
Je pense que ces affirmations ne prennent pas en compte le cas que j'ai exposé au-dessus. En effet, si le constructeur ou le destructeur ont des effets de bord, il n'est pas possible de faire l'optimisation.
Marsh Posté le 15-09-2003 à 18:36:29
et dans tous les cas ce détail est laissé libre à l'implémentation. donc il n'y a aucun de problème, sauf pour les conceptions et codes de mauvaises factures
Marsh Posté le 15-09-2003 à 18:43:34
Ben dans mon sujet au-dessus, je présente un cas où un compilateur qui ferait tout le temps l'optimisation ferait une erreur. En effet, en cas d'optimisation, numInstances_ vaudrait 1 alors qu'il doit faire 2.
Marsh Posté le 15-09-2003 à 18:46:24
mais c'est pas une otpimisation !
la norme dit "on peut faire une copie inutile ou pas"
et pi je peux te dire le contraire num vaut 2 au lieu de 1
Marsh Posté le 15-09-2003 à 19:04:11
Bon, j'admets m'être misérablement planté...
En relisant en entier l'article que je cite au-dessus, je me suis rendu compte qu'en fait en juillet 1996 le comité ANSI/ISO s'était réuni et autorisait l'élimination de la copie inutile (d'après les conditions énumérées dans DWP
12.8 - c'est quoi ça ?).
Marsh Posté le 25-07-2003 à 23:55:01
qui donne avec mon compilateur (g++ 3.3.1)
Foo() this = 0xbffffc30
f()
Foo() this = 0xbffffc20
opertor=(Foo) this = 0xbffffc30 other = 0xbffffc20
~Foo() this = 0xbffffc20
g()
Foo(int) this = 0xbffffc20
opertor=(Foo) this = 0xbffffc30 other = 0xbffffc20
~Foo() this = 0xbffffc20
h()
Foo() this = 0xbffffc20
opertor=(Foo) this = 0xbffffc30 other = 0xbffffc20
~Foo() this = 0xbffffc20
~Foo() this = 0xbffffc30
Message édité par Taz le 25-07-2003 à 23:56:10