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...
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) ?
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 :
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.
× 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.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html