Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 2008
-
19 mai 2004 à 17:41
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 2008
-
19 mai 2004 à 23:05
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 19 mai 2004 à 19:26
elle est avantageuse quand il y a plusieurs choses à revoyer, ca évite de créer une structure exprès, on utilise aussi cela quand on travaille sur des structures.
Mais pour ton exemple GetRotation, la différence est insignifiante
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 19 mai 2004 à 19:42
Oui, c'est vrai qu'on peut renvoyer toutes sortes de variable (D3DXVECTOR3, float, double) sans avoir créé une structure dont on aurait renvoyé le pointeur.
Mais pour que les developpeurs de directX aient choisi la 1ere methode, c'est qu'elle a un avantage.
Peut-etre que le renvoi d'une variable avec return est "mal" compilé car VC++ prend des precautions ou doit allouer plus de variables temporaires.
Ou encore c'est peut-etre pour eviter que nous fassions des lignes de codes en C++ ultra longues qui seront forcement compilées de facon non optimales...
Bon, j'hesite a modifier toutes mes fonctions (pour l'instant, yen n'a pas beaucoup donc...)
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 19 mai 2004 à 20:25
non la tu te trompe, déja ta permière fonction ne marchera pas car tu renvoie l'adresse d'une varible globale, qui n'existera plus après l'appel de la fonction
La raison qui pousse a utiliser des pointeurs pour les structures est que leur taille est assez importante, donc ca peu être couteux de créer un structure à chaque appel de fonction, ce qui n'est pas le cas avec les types int char...
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 19 mai 2004 à 20:53
Exact vecchio56, le D3DXVECTOR2 out n'existe plus apres l'appel de la fonction.
Mon interpretation pour la premiere methode (surement fausse car je ne sais pas comment ca marche):
La fonction est copiée dans la RAM au lancement du programme. Le vecteur out ainsi que le pointeur pOut ont une place dans la RAM.
Quand la fonction est appelée, on copie l'adresse de out dans pOut (inutile de le faire a chaque fois car out est fixe dans la RAM).
Ensuite on a les calculs qu'on peut effectuer sans passer par des registres (si le compilateur est bon....).
Puis on retourne le pointeur_vers_out.
Meme si out n'existe plus, l'adresse qu'on renvoie pointe out valeurs car la RAM n'a pas bougée.
djl > Quand je ne mets pas le void, ca se compile avec un warning.
Pour les optmisations générales (genre inline), connais-tu un site qui en enumere ?
Avant de programmer plein de fonctions j'aimerais acquerir une methode qui me permettra de "bien programmer" dans le sens, "programmer en facilitant le travail du compilo en le guidant dans son interpretation du code en langage machine". En gros l'aider a compiler de facon optimale.
J'ai des connaissances en assembleur donc ca devrait aller. Encore faut-il que je comprenne exactement le C++.
C'est pour ca que je fais appel a vous :-).
La premiere fonction est sensiblement plus rapide que l'autre.
Car dans la premiere, les 3 operations sont compilées tres facilement en 3 operations logique.
Alors que dans la premiere, le compilateur passe sans doute par des registres.
djl > je ne sais pas trop quoi poster comme code qui puisse servir d'exemple pour de l'optimisation. Je risque de poster des tonnes de lignes inutiles. Mais je n'hesiterai pas a poster un autre sujet si jamais j'ai des doutes sur des fonctions.
sinon je dirai que la 2e fonction est surtout plus rapide parce qu'il y a une copie de D3DXVECTOR2 en moins (pOut = pV1;)
ca fait autant d'affectation membre à membre en moins
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 19 mai 2004 à 22:49
"sinon je dirai que la 2e fonction est surtout plus rapide parce qu'il y a une copie de D3DXVECTOR2 en moins (pOut = pV1;)
ca fait autant d'affectation membre à membre en moins "
me suis tromper j'avais pas que c'etait des pointeurs, mais copie en moins quand meme, pour le si peu d'instruction ca compte, sinon je sais pas si a+=b sera different de a=a+b, normalement selon le standard ca devrai pas, ou alors le compilateur devrait optimiser l'operateur +=
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 19 mai 2004 à 22:57
djl > je pense que favoriserai enormement les -=, +=, ++, -- dans mes programmes car l'equivalent assembleur est tres simple (sub, add, inc, dec) donc rapide. Le compilo ne peut pas se tromper !
Et je favoriserai egalement les fonctions qui ne renvoient pas de valeurs parceque je ne vois pas trop comment il converti ca en langage machine...
En assembleur, ca allait parcequ'on passe par des registres tous le temps, mais la.... le c++ est quand meme plus evolué.
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 19 mai 2004 à 23:01
en c++ il utilise la pile, pour les valuer retour et les parametre, pour les registre tu a register mais c'est depassé, les compilos gere ca eu meme et le font tres bien, utilise les valeur retour san crainte