web-dev-qa-db-fra.com

Renvoyer un C ++ std :: Vecteur sans copie?

Est-il possible de renvoyer un conteneur standard d'une fonction sans effectuer une copie?

Exemple de code:

std::vector<A> MyFunc();

...

std::vector<A> b = MyFunc();

Pour autant que je sache, cela copie la valeur de retour dans un nouveau vecteur b. Rendre la fonction renvoie les références ou quelque chose comme cela permettant d'éviter la copie?

29
static_rtti

Si votre compilateur prend en charge le NRVO, aucune copie ne sera effectuée, à condition que certaines conditions soient remplies dans la fonction renvoyant l'objet. Heureusement, cela a finalement été ajouté à Visual C++ 2005 (V8.0) Cela peut avoir un impact majeur + VE sur Perf si le conteneur est grand, évidemment.

Si vos propres documents du compilateur ne disent pas si elle est prise en charge ou non, vous devriez pouvoir compiler le code C++ à assembler (en mode optimisé/libération) et vérifier ce qui est fait à l'aide d'une simple fonction d'échantillon.

Il y a aussi une excellente discussion plus large ici

28
Steve Townsend

Revalues ​​("temporaires") liées à const _ Les références auront leur durée de vie prolongée à la fin de la vie de la référence. Donc, si vous n'avez pas besoin de modifier ce vecteur, les suivants feront:

const std::vector<A>& b = MyFunc();

Si Vous devez modifier le vecteur, il suffit de coder la manière la plus facile à lire jusqu'à la preuve (obtenue par le profilage) que cette ligne compte même de la performance.

Sinon, reposez-vous sur C++ 1X avec ses références de rap, ainsi que des sémantes de déménagement, venant "réel bientôt" et optimiser cette copie sans que vous ayez à faire quoi que ce soit.

14
sbi