Version courte: Il est courant de retour des objets volumineux tels que les vecteurs/matrices-dans de nombreux langages de programmation. Est-ce le style de maintenant acceptable dans C++0x si la classe possède un constructeur de déplacement, ou de faire les programmeurs en C++ considérer que c'est bizarre/laid/abomination?
Version longue: Dans C++0x est-ce encore considéré comme une mauvaise forme?
std::vector<std::string> BuildLargeVector();
...
std::vector<std::string> v = BuildLargeVector();
La version traditionnelle devrait ressembler à ceci:
void BuildLargeVector(std::vector<std::string>& result);
...
std::vector<std::string> v;
BuildLargeVector(v);
Dans la version la plus récente, la valeur renvoyée par BuildLargeVector
est une rvalue, donc v serait construit à l'aide du constructeur de déplacement de l' std::vector
, en supposant (N)RVO n'a pas lieu.
Même avant le C++0x la première forme souvent d'être "efficace" à cause de (N)RVO. Cependant, (N)RVO est à la discrétion du compilateur. Maintenant que nous avons des références rvalue il est garanti qu'aucune copie en profondeur aura lieu.
Edit: la Question n'est pas vraiment à propos de l'optimisation. Les deux formes ont presque identiques performances dans le monde réel des programmes. Alors que, dans le passé, la première forme pourrait avoir eu l'ordre de grandeur de moins bonnes performances. En conséquence, la première forme a été l'un des principaux odeur de code dans la programmation en C++ pour un long moment. Pas plus, j'espère?