Partage
  • Partager sur Facebook
  • Partager sur Twitter

Class vector

Meilleur moyen de retourner un vector

Sujet résolu
    20 septembre 2007 à 12:30:32

    Bonjour a tous,
    j'ai quelques petites questions sur comment retourner un vecteur, enfin surtout sur comment ca se passe au niveau de la memoire lors du return...

    Petit bout de code pour illustrer mes questions :)

    1. //renvoi la liste des noms d appli d un profil
    2. vector <string>         get_appli_from_profil(string profil)
    3. {
    4.      vector <string>  appli;
    5.      PassageParam     *Pp = RecupListeAppli(profil.c_str());   
    6.      InfoAppli        *Ia;
    7.      for (int i = 0; i < Pp->Size(); i++)
    8.      {
    9.         Ia = RecupInfoAppli(Pp->tabString[i].c_str());
    10.         appli.push_back(Ia->nomParamAppli);
    11.         libereInfoAppli(Ia);
    12.      }
    13.      return (appli);
    14. }
    15. //recupere les applications communes aux profils selectionnes
    16. void    get_appli_com()
    17. {
    18.     vector <string>  appli_base;
    19.     int              k;
    20.     for (int i = 0; i < (int)profil_appli.size(); i++)
    21.     {
    22.        appli_base = get_appli_from_profil(profil_appli[i]);
    23.        for (k = 0; k < (int)appli_base.size(); k++)
    24.           //futur instructions
    25.        appli_base.clear();
    26.     }
    27. }


    Donc en gros la je remplis mon vecteur, et je le retourne.
    C'est ici que j'ai des questions...
    Mon vecteur appli_base a recuperer l'adresse du vecteur creer en amont (ce dont je doute), ou il n'est qu'une copie ?
    Si il s'agit d'une copie, apres le return de mon vecteur (dans la fonction get_appli_from_profil) celui la est "free" ou il est reste en memoire (ce qui augmenterai donc la memoire utilisee par l'appli a chaque appelle de get_appli_from_profil) ?
    • Partager sur Facebook
    • Partager sur Twitter
      20 septembre 2007 à 14:52:43

      dans ta fonction d'en haut :
      vector <string> appli;
      est une variable locale : donc quand elle retournée, elle est copiée dans "appli_base " de ta fonction d'en bas, puis détruite.
      ça fait donc une recopie : donc si le vector est énorme, du temps perdu pour rien.
      Mon conseil pour remplir un vector :

      1. void remplit(std::vector<truc>& p)
      2. {
      3.    p.push_back(....);
      4. }
      5. void appelante()
      6. {
      7.    std::vector<truc> p;
      8.    remplit(p);
      9. }


      Dans ce cas la : pas de recopies :)
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        20 septembre 2007 à 15:05:36

        Ok merci bien de ta reponse :)

        J'avais penser a envoyer un pointeur (oui oui je pense encore en C ><) mais ca me paraissait moins bien... va savoir pourquoi :-° .

        • Partager sur Facebook
        • Partager sur Twitter
          20 septembre 2007 à 15:55:14

          Passage par référence :) ça en jette !
          Finalement, en interne, ça revient au meme qu'un passage par pointeur ! Mais ça fait davantage C++ :)
          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            20 septembre 2007 à 22:35:22

            Beaucoup de compilos savent optimiser les retours par valeur pour faire comme si la variable avaient été directement contruite dans sa position finale -- sous certaines conditions bien précises.

            Fais une recherche sur RVO, RNVO. Pour les cas où ni RVO, ni RVO ne sont pas appliqués (/applicables) par ton compilo, tu peux :
            - faire comme Fvirtman te l'a indiqué
            - retourner un tableau classique avec les risques non négligeables de mauvaise gestion que cela implique
            - utiliser une forme de auto_vector<> ou une autre pour émuler une sémantique de déplacement
            - attendre gentillement les compilos C++0x qui proposeront un moyen natif d'avoir une sématique de déplacement, qui sera utilisée dans les futurs std::vector<>
            - payer le prix parce que au fond, c'est ridicule par rapport à ce que fait le reste de ton code -- pour ça, tu devras profiler ton code pour évaluer où tu perds vraiment du temps. (prendre tes chaines par copie, transformer d'une API alien vers une plus standard, etc., ne vont pas aider non plus)


            PS: ton cast en int des tailles est des plus louches -> std::vector<>:size_type est le bon type à utiliser.
            • Partager sur Facebook
            • Partager sur Twitter
            C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

            Class vector

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown