Paramètres des fonctions

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 19 mai 2004 à 17:41
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 19 mai 2004 à 23:05
Salut !

Un exemple vaut bien mieux qu'un discours:

CD3DSprite::GetRotation(float* rotation)
{ *rotation=m_fRotation; }

float CD3DSprite::GetRotation(void)
{ return m_fRotation; }

Ces 2 fonctions remplissent le meme role: renvoyer la valeur de l'angle de rotation m_fRotation contenu dans la classe CD3DSprite.

Utilisation:

1er cas:
float angle;
...->GetRotation(&angle);

2eme cas:
float angle = ...->GetRotation();

La premiere methode est sans doute plus avantageuse car les fonctions directX l'utilisent sans cesse:

D3DXVECTOR2* D3DXVec2Add
( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 );

D3DXVECTOR2* D3DXVec2Subtract
( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 );

D3DXVECTOR2* D3DXVec2Minimize
( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 );

D3DXVECTOR2* D3DXVec2Maximize
( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV1, CONST D3DXVECTOR2 *pV2 );

En quoi cette methode est elle meilleure ? Est-elle plus performante ou seulement plus pratique ?

Thanks

18 réponses

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
19 mai 2004 à 19:23
Pardon, je viens de realiser que j'ai dit une grosse connerie :-) !
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
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...)

Je vais faire des benchs.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 mai 2004 à 19:50
non je pense que tu te trompes, c'est juste parce que ce sont des structures qui sont passées
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
19 mai 2004 à 20:19
Je me trompe? Ou?
Je n'ai jamais parlé de renvoyer des structures entieres mais seulement des pointeurs.

En fait l'avantage pour dirextX est evident:

D3DXVECTOR2* D3DXVec2Subtract2(D3DXVECTOR2 *pV1, D3DXVECTOR2 *pV2)
{
D3DXVECTOR2 out;
D3DXVECTOR2* pOut = &out;
pOut->x = pV1->x - pV2->x;
pOut->y = pV1->y - pV2->y;

return pOut;
}

void D3DXVec2Subtract3(D3DXVECTOR2 *pOut, D3DXVECTOR2 *pV1, D3DXVECTOR2 *pV2)
{
pOut->x = pV1->x - pV2->x;
pOut->y = pV1->y - pV2->y;
}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 mai 2004 à 20:27
tu peux retirer le void en parametre, ca ne s'applique qu'au c

sinon il faut faire

inline float CD3DSprite::GetRotation()
{ return m_fRotation; }

en plus d'inserer le code, inline autorise le compilo a faire d'autre optimisations
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
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 :-).

Grand merci a vous deux !
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 mai 2004 à 21:04
pour les optimsations qui découle du c++, ca depend d'abord de si le compio suit bien le standard

a prior aujourd'hui pas de probleme, seulement elles sont nombreuses

montre donc un code c++ ou autre pour voir, ca ira plus vite

et dit moi donc quel est ce compilo qui fout un warning en l'absence du void?
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
19 mai 2004 à 22:35
Le compilo qui fout un void est ..... bon allez je balance :-), c'est VC++ 6.0 !

warning C4508: 'D3DXVec2Subtract3' : function should return a value; 'void' return type assumed

D3DXVec2Subtract2(D3DXVECTOR2 *pOut, D3DXVECTOR2 *pV1, D3DXVECTOR2 *pV2)
{
pV1->x -= pV2->x;
pV1->y -= pV2->y;
pOut = pV1;
}

D3DXVec2Subtract3(D3DXVECTOR2 *pOut, D3DXVECTOR2 *pV1, D3DXVECTOR2 *pV2)
{
pOut->x = pV1->x - pV2->x;
pOut->y = pV1->y - pV2->y;
}

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.

@+
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 mai 2004 à 22:45
quand djl disait d'enlever le void, je pense que c'était pour

float CD3DSprite::GetRotation(void)
{ return m_fRotation; }
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
19 mai 2004 à 22:45
je parlai du void en parametre

float CD3DSprite::GetRotation(void)
{ return m_fRotation; }

qui n'est pas necessaire, mais plutot

float CD3DSprite::GetRotation()
{ return m_fRotation; }

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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 mai 2004 à 22:48
est puis dans ton message précédent, il y a une des deux qui modifie pV1 et l'autre pas, comparons ce qui est comparable
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
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 +=
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
19 mai 2004 à 22:50
Ah oui meeeeeeeeeeeeeeeeerde !

Donc le compilo passe par des registres.
Mais c'est pas genant si on n'a plus besoin de *pv1 apres.
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
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é.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
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
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
19 mai 2004 à 23:05
D'accord djl, je sous-estime sans doute le compilateur...
Je vais mediter sur ce que j'ai appris aujourd'hui grace a vous.

Merci enormement !

PS: Qu'est ce que ca devait etre chiant sans internet !!
0
Rejoignez-nous