IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

recherche expert assembleur (objet temporaire en retour de fonction)


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 353
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 353
    Points : 1 417
    Points
    1 417
    Par défaut recherche expert assembleur (objet temporaire en retour de fonction)
    Bonjour,

    J'aimerais comparer la qualité du code generé dans deux cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    class Vector3
    {
    public:
     
    	union {
    		struct { double x,y,z; };
    		double _array[3];
    	};
     
    	Vector3() : x(0), y(0), z(0) {
    	}
     
    	Vector3( double ax, double ay, double az ) : x(ax), y(ay), z(az) {
    	}
     
    	const Vector3 operator+ ( const Vector3 & rhs ) const {
    		return Vector3( x+rhs.x, y+rhs.y, z+rhs.z );
    	}
     
    	void add ( const Vector3 & rhs ) {
    		x+=rhs.x;
                    y+=rhs.y;
                    z+=rhs.z;
    	}
    };
     
    int main(int argc, char* argv[])
    {	
    	Vector3 v1( 10, 10, 10 );
    	Vector3 v2( 1, 2, 3 );
     
            // vaut-il mieux
            v1 = v1 + v2;
     
            // ou bien
            v1.add( v2 );
    }

    D'apres le code generé est-il couteux d'utiliser l'operateur + par rapport a la fonction add() ?

    et dans le cas ou on veut stoker le resultat dans une autre variable:
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Vector3 v(v1);
    v1.add(v2);
    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Avant de parler de code généré, on peut déjà voir des choses dans le code C++.

    Comme par exemple que le résultat de l'opérateur + est renvoyé par copie alors que le add() fait directement les calculs sur la cible.

    Conclusion, le add() est théoriquement plus rapide que l'opérateur +.
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 353
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 353
    Points : 1 417
    Points
    1 417
    Par défaut
    en fait, j'ai beaucoup lu que le compilateur sait vraiment optimizer quand on fait un return Vector3(...) avec un assignation direct derriere.

    donc perso je pense que ca met le meme temps, mais a confirmer avec le code generé ....

    a+

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Dans ce cas très précis, il vaut mieux utiliser +=. Opérateur qui devrait de toutes façons servir de base à l'implémentation de l'opérateur libre +.

    Dans l'absolu il vaut mieux utiliser une bibliothèque robuste et optimisée comme boost.ublas ou Blitz++ qui savent éliminer des temporaires grâce à la méta-programmation. (-> tiny array pour les vecteurs non redimensionnables)
    Elles requièrent des compilos non anciens -- la norme de 98 a tout de même 8 ansn mine de rien.

    Quant au RVO et RNVO, la qualité de leur implémentation dépend de chaque compilateur.

    Fais une recherche sur le document n1666 qui est un pdf -> google: "C++ n1666 filetype:pdf"

    Et avec un peu de chance, la future norme de 2009 nous offrira la sémantique de déplacement native.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 353
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 353
    Points : 1 417
    Points
    1 417
    Par défaut
    J'a trouvé la reponse:


    Use the return value optimization to give the compiler a hint that temporary
    objects can be eliminated. This technique enables the compiler to use the
    ISO/IEC TR 18015:2004(E) Technical Report on C++ Performance
    © ISO/IEC 2004 — All rights reserved Page 49 of 192

    memory for a function's return value to hold a local object of the same type
    that would otherwise have to be copied into the return value location, thus
    saving the cost of the copy. This is usually signalled by inserting constructor
    arguments into the return statement:
    const Rational operator * (Rational const & lhs,
    Rational const & rhs)
    {
    return Rational(lhs.numerator() * rhs.numerator(),
    lhs.denominator() * rhs.denominator());
    }
    Less carefully written code might create a local Rational variable to hold the
    result of the calculation, use the assignment operator to copy it to a temporary
    variable holding the return value, then copy that into a variable in the calling
    function.

    // not this way ...
    const Rational operator * (Rational const & lhs,
    Rational const & rhs)
    {
    Rational tmp; // calls the default constructor (if any)
    tmp.my_numerator = lhs.numerator() * rhs.numerator();
    tmp.my_denominator = lhs.denominator() * rhs.denominator();
    return tmp; // copies tmp to the return value, which is
    // then copied into the receiving variable
    }

    However, with recent improvements in compiler technology, modern
    compilers may optimize this code in a similar manner.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 353
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 353
    Points : 1 417
    Points
    1 417
    Par défaut
    Citation Envoyé par Luc Hermitte
    Dans ce cas très précis, il vaut mieux utiliser +=. Opérateur qui devrait de toutes façons servir de base à l'implémentation de l'opérateur libre +.

    Dans l'absolu il vaut mieux utiliser une bibliothèque robuste et optimisée comme boost.ublas ou Blitz++ qui savent éliminer des temporaires grâce à la méta-programmation. (-> tiny array pour les vecteurs non redimensionnables)
    Elles requièrent des compilos non anciens -- la norme de 98 a tout de même 8 ansn mine de rien.

    Quant au RVO et RNVO, la qualité de leur implémentation dépend de chaque compilateur.

    Fais une recherche sur le document n1666 qui est un pdf -> google: "C++ n1666 filetype:pdf"

    Et avec un peu de chance, la future norme de 2009 nous offrira la sémantique de déplacement native.

    Merci Luc pour ton pdf, il apporte la reponse que je me souvenais bien avoir lu quelque part.

    Par contre je ne sais pas ce que veut dire RVO et RNVO ?

    sinon je ne veux pas utiliser d'autres libs, et sinon blitz++ est GPL
    et je ne sais pas l'avenir de mon code....

    a+ et merci

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Par contre je ne sais pas ce que veut dire RVO et RNVO ?
    "Return Value Optimization" et "Named Return Value Optimization" (en fait c'est NRVO).
    Boost ftw

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 353
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 353
    Points : 1 417
    Points
    1 417
    Par défaut
    merci
    je continue donc dans cette maniere de faire...

    a+

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par epsilon68
    Merci Luc pour ton pdf, il apporte la reponse que je me souvenais bien avoir lu quelque part.
    C'est un peu le meilleur document que je connaisse sur la question.

    sinon je ne veux pas utiliser d'autres libs, et sinon blitz++ est GPL
    et je ne sais pas l'avenir de mon code....
    Même pas QT ? ;P
    La licence de Blitz++ peut effectivement être problématique -- je n'y avais jamais prété attention. Pour boost.ublas, honnêtement, tu vas redévelopper des trucs "classiques" qui ne seront jamais aussi efficaces avant plusieurs années.
    NB: C'est au demeurant un excellant exercice pour tous niveaux.

    "Named Return Value Optimization" (en fait c'est NRVO).
    Ah! Au temps pour moi. Je me disais bien que je n'arrivais pas à trouver d'expression en anglais correct qui colle pour RNVO. :blush:

    je continue donc dans cette maniere de faire...
    Tu paies toujours le prix d'une affectation. Le RVO économise juste le prix de la copie qui aurait été due au retour par valeur.
    Donc. Solution simple -> +=
    Solution bidouille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    T x(.....); ....
    {
       T u = x + y; // RVO
       x . swap(u); // pseudo déplacement des responsabilités
       // On paie tout de même une allocation et une libération (sauf si pool d'objets)
    }
    Solution évoluée. Mettre en place une dualité type final, types intermédiaires mémorisant les opérations pour économiser les temporaires. Ce que font Blitz++ et les bibliothèques qui ont utilisé la technique d'Expressions Templates. Je lis que NewMat serait la première qui aurait été capable de distinguer "x = A*x" et "y = A * x".
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 353
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 353
    Points : 1 417
    Points
    1 417
    Par défaut
    Citation Envoyé par Luc Hermitte
    Même pas QT ? ;P
    La licence de Blitz++ peut effectivement être problématique -- je n'y avais jamais prété attention. Pour boost.ublas, honnêtement, tu vas redévelopper des trucs "classiques" qui ne seront jamais aussi efficaces avant plusieurs années.
    NB: C'est au demeurant un excellant exercice pour tous niveaux.
    He He He ...
    et si Qt et libxml sont des libraries qui ne peuvent etre remise en cause par moi, ca fait tres longtemps que j'explore toutes les solutions, et ces deux libs sont des theoremes pour moi.

    l'interet est aussi de refaire des choses qui existent, sinon pourquoi continuer Linux alors qu'il y a windows qui marche bien ? je m'egare peut etre un peu (mais jsuis l'auteur de cette discussion ;-)

    comme tu l'as dis c'est un bon exercice, mais aussi c'est construire la lib qui nous ressemble.

    a+ et merci pour vos reponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recherche selon un objet
    Par gokudomatic dans le forum JPA
    Réponses: 4
    Dernier message: 25/02/2007, 14h49
  2. Recherche d'un objet 'window' par son nom
    Par herve91 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/02/2007, 17h54
  3. [FLASH MX2004][expert] Programmation objet clips dynamiques
    Par CUCARACHA dans le forum ActionScript 1 & ActionScript 2
    Réponses: 13
    Dernier message: 24/09/2006, 12h27
  4. Réponses: 5
    Dernier message: 13/11/2005, 20h10
  5. Recherche solution pour fichiers temporaires structurés
    Par RamDevTeam dans le forum Bases de données
    Réponses: 7
    Dernier message: 25/10/2005, 15h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo