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

Langage C++ Discussion :

Optimisation Listechainé avec template et operateur surchargé.


Sujet :

Langage C++

  1. #1
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut Optimisation Listechainé avec template et operateur surchargé.
    J'ai créer une liste chainé qui permet ce type d'ecriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      CListe<int *> plop;
      plop += new int(5);
      plop += new int(14);
      plop += new int(30);
      plop[1] = new int(89);
      std::cout << "il y en a " << plop.getNombre() << std::endl;
      plop.afficher(); //methode de test. qui affiche tout les elements a l'indirection des entiers.
    Bon jusque la tout marche bien mais c'est biensur pas parce que ca marche que c'est bien.

    Quand j'utilise l'operateur d'indexation je remplace la valeur du pointeur pour lui donner la nouvelle adresse seulement l'instance precedant n'est pas delete, et donc a chaque resaisie j'ai une instance en memoire que je ne controle plus et j'aimerais gerer cela.

    voici le code de l'operateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      T &operator[](unsigned int rang)
        {
          CCellule<T> *uneCellule = premier;
     
          for(int i = 0; i< rang;i++, uneCellule = uneCellule->getSuivant());
          return *uneCellule->getPtInformation();
        }
    Je ne peut pas delete l'anciene instance puis resaisir par le return systematiquement (par la reference) car certaines fois l'operateur est utilisé en lecture seulement.

    Toute idée est bienvenue.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    A part utiliser des smart pointers je ne vois pas trop comment tu pourrais t'en sortir.

  3. #3
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Hum j'ai pas toujours entendu du bien des smarts pointeur ni de leurs efficacité.

    Je me retrouve bien bloqué, j'ai peut-etre un idée mais je suis pas certain que ca soit le top je m'explique.

    Je pourait gerer la liste de tout les pointeur instancé depuis l'instanciation de la class de liste, puis regulierement checker et virer celles qui font plus parti de la liste, on reprend le principe de garbage collector.
    Avantage je sais que ma liste ne saturera pas la memoire inutilement.
    Desaventage pour une utilisation succinte la liste sera plus lourde.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Si on veut différentier les accès en lecture de ceux en écriture, la solution classique est de ne pas retourner directement l'élément, mais un proxy vers cet élément. charge à ce proxy de supprimer l'élément si on appelle l'opérateur= dessus.

    Par ailleurs, j'ai l'impression que ta liste est du coup uniquement prévue pour gérer des pointeurs (puisque tu veux deleter les éléments au besoin). Dans ce cas, plutôt que de déclarer une CListe<int*>, il me semblerait plus clair de déclarer une CPtrList<int>.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Les smart pointers c'est vaste.
    Comme dit Loïc, cela peut simplement être une classe qui encapsule ton pointeur pour détecter l'operateur =, sans entrer dans le comptage de référence.
    En écrivant bien la chose avec des inlines, il est possible qu'il n'y ait même pas d'overhead.

    Par contre, comme tu à l'air de te soucier de l'optimisation, j'aimerais bien savoir quel genre d'appli tu fais et ce qui t'amène à vouloir optimiser ?
    Deuxieme question : est ce vraiment de simples ints que tu compte mettre dans ta liste?

    Si non, peut être que les small objects de Loki pourraient t'intéresser également.

  6. #6
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    A vrais dire ce programme sera utilisé pour justifier la competence objet dans l'un de mes projets de fin d'année (BTS IG dev).
    En temps normal j'aurais simplement utilisé une list<T> je pense mais afin de pouvoir bien parler de l'objet a mon oral, j'ai préféré créer moi meme mon contenneur.

    Ensuite l'application devras stocker des objet en tout genre (puisque j'ai un ensemble de class metier).

    A savoir que j'aurait certainement une interface graphiqure .Net donc avec un ramasse-miette qui fera en sorte que mes instances stocké seront géré.

    Si j'insiste pour avoir une class de liste bien propre c'est qu'il va certainement m'interroger dessu, et que si je peut eviter le genre de quesion "comment on peut liberer l'espace reservé sur les ancienes instances ?"

    La class doi pouvoir stocker du static comme du dynamique si je presente ca comme un moyen "universel"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Si on veut différentier les accès en lecture de ceux en écriture, la solution classique est de ne pas retourner directement l'élément, mais un proxy vers cet élément. charge à ce proxy de supprimer l'élément si on appelle l'opérateur= dessus.
    C'est a dire ?
    Je comprend pas tres bien ou tu veux en venir, tu peut codder un petit exemple ?
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  7. #7
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Apres plusieurs test j'ai créer une class "tampon" qui stock l'information et a laquette je veux surcharger l'operateur = pour detecter si c'est une lecture ou une ecriture comme vous me l'avez conseillé.

    j'ai donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      T &operator[](unsigned int rang)
        {
          CTampon<T> tmp(*informationAt(rang));
          return tmp.getInformation();
        }
    quand la surcharge de l'operateur = de la classe CTampon ca donne ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      T &getInformation()
        {
          return information;
        }
     
      void operator=(T Ainformation)
        {
          std::cout << "OPERATEUR BIEN APPELE";
        }
    Et visiblement la surcharge n'est pas appellé.
    Je ne comprend pas puisque je return dans CListe[i] un CTampon qui recoit une valeur avec =

    [EDIT] En fait non c'est normal puisque ca marche pas puisque je retourne l'information et non pas la class de Tampon.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    L'idée est un truc du genre (code non testé, même pas relu) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template <class T> 
    class proxy
    {
      proxy(T* myData);
      T* myData;
      T* operator->() {return myData;} // accès en lecture
      void operator=(T*newData) // accès en écriture
      {
        delete myData;
        myData = newData;
      }
    };
    Et on modifie l'opérateur[] de la liste pour qu'il renvoie un proxy<T>
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    alors c'est ce que j'avait essayer d'implementer en fesant mal, je vais continuer par la, merci beaucoup d'avoir passé un peu de temps a m'aider je vais m'en sortir.

    [EDIT] Tout est testé et marche parfaitement, merci beaucoup
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

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

Discussions similaires

  1. Surchargé une fonction template avec template
    Par SKone dans le forum Langage
    Réponses: 2
    Dernier message: 12/10/2014, 20h00
  2. Template, et operateur surchargés !
    Par DakM dans le forum Langage
    Réponses: 14
    Dernier message: 17/11/2011, 17h23
  3. optimisation requetes avec base de données
    Par flogreg dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 05/07/2005, 14h54
  4. Optimisation HTML avec Tomcat
    Par zekey dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 23/03/2005, 12h24
  5. Conversion avec template
    Par indy2 dans le forum Langage
    Réponses: 10
    Dernier message: 23/03/2005, 00h02

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