Retourner un c++ std::vecteur sans copie?

est-il possible de retourner un conteneur standard d'une fonction sans faire de 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. Est-ce que faire la fonction renvoie des références ou quelque chose comme ça permet d'éviter la copie?

23
demandé sur static_rtti 2010-09-15 23:43:20

3 réponses

si votre compilateur supporte la NRVO alors aucune copie ne sera faite, à condition que certaines conditions soient remplies dans la fonction retournant l'objet. Heureusement, cela a finalement été ajouté dans Visual C++ 2005 (v8.0) cela peut avoir un impact majeur +ve sur le perf si le conteneur est grand, évidemment.

si vos propres Docs de compilateur ne disent pas si oui ou non il est supporté, vous devriez être en mesure de compiler le code C++ vers l'assembleur (en mode optimisé / release)) et vérifiez ce qui est fait en utilisant une simple fonction d'échantillon.

il y a aussi une excellente discussion plus large ici

26
répondu Steve Townsend 2017-05-23 10:29:57

Rvalues ("temporaires") lié à la 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 fera:

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

si vous avez besoin de modifier le vecteur, il suffit de le coder de la façon la plus facile à lire jusqu'à ce que vous avez la preuve (obtenue par profilage) que cette ligne importe même performance-sage.

sinon faites confiance à C++1x avec ses références rvalue et déplacez la sémantique qui arrive "très bientôt" et optimisez cette copie sans que vous ayez à faire quoi que ce soit.

13
répondu sbi 2010-09-15 20:44:41

si vous pouvez modifier la signature de la fonction, alors vous pouvez utiliser

std::vector<A>& MyFunc(); 

ou

void MyFunc(std::vector<A>& vect);

vous pouvez aussi retourner un pointeur intelligent, mais cela implique de changer l'objet.

some_smart_pointer<std::vector<A>> MyFunc();

HTH

2
répondu beezler 2010-09-15 19:54:21