Retour d'un c++ std::vector sans une copie?
Est-il possible de retourner un conteneur standard à partir d'une fonction sans en faire une copie?
Exemple de code:
std::vector<A> MyFunc();
...
std::vector<A> b = MyFunc();
Comme je le comprends, cela permet de copier la valeur de retour dans un nouveau vecteur b. Ne faire le retour de la fonction des références ou quelque chose comme ça permet d'éviter la copie?
- Double de stackoverflow.com/questions/3703302/...?
Vous devez vous connecter pour publier un commentaire.
Si votre compilateur prend en charge la NRVO alors aucune photocopie ne sera faite, pourvu que certaines conditions sont remplies dans la fonction de retour de l'objet. Heureusement, ce fut enfin ajouté dans Visual C++ 2005 (v8.0) Cela peut avoir un grand +ve impact sur les perf si le récipient est grand, évidemment.
Si votre propre compilateur docs ne dis pas qu'il soit ou non pris en charge, vous devriez être en mesure de compiler le code C++ à assembler (dans optimisé/mode de diffusion) et de vérifier ce qui est fait à l'aide d'un exemple simple de fonction.
Il y a aussi une excellente discussion plus large ici
Rvalues ("temporaires") lié à
const
références ont leur durée de vie prolongée jusqu'à la fin de la référence de sa vie. Donc, si vous n'avez pas besoin de modifier ce vecteur, ce qui suit va faire:si vous avez besoin de modifier le vecteur, juste le code de la façon la plus simple à lire jusqu'à ce que votre avoir la preuve (obtenu grâce au profilage) que cette ligne même des questions de performance.
Contraire s'appuyer sur C++1x, avec ses références rvalue et la sémantique de déplacement le long à venir "réel dès maintenant" et l'optimisation de cette copie, sans que vous ayez à faire quoi que ce soit.
Si vous pouvez modifier la signature de la fonction, alors vous pouvez utiliser
ou
Vous pouvez également retourner un pointeur intelligent, mais qui implique newing l'objet.
HTH
std::vector<A>& MyFunc();
est que le vecteur doit être allouée quelque part -MyFunc
ne peut pas allouer sur la pile et de retourner une référence. Il est possible, si le vecteur est un membre de la classe et vous êtes tout simplement rentrer une référence à un vecteur.