Il semble que le principal conseil concernant C++0x du rvalues est d'ajouter des constructeurs de déplacement et de déplacer les opérateurs à vos classes, jusqu'à ce que les compilateurs de défaut de les mettre en œuvre.
Mais l'attente est une stratégie perdante si vous utilisez VC10, parce que la génération automatique ne sera probablement pas ici jusqu'à ce que VC10 SP1, ou dans le pire des cas, VC11. Probablement, l'attente va être mesurée en années.
Ici se trouve mon problème. Écrire tout ce code en double n'est pas amusant. Et c'est désagréable à regarder. Mais c'est un fardeau bien reçu, pour ces classes réputée lente. Pas tellement pour les centaines, sinon des milliers, des classes plus petites.
::soupire:: C++0x était censé me laisser écrire moins de code, pas plus!
Et puis j'ai eu une pensée. Partagé par beaucoup de gens, je suppose.
Pourquoi ne pas simplement passer le tout par la valeur? Ne std::move + copie élision de faire de cette presque optimale?
Exemple 1 - typiquement Pré-0x constructeur
OurClass::OurClass(const SomeClass& obj) : obj(obj) {}
SomeClass o;
OurClass(o); // single copy
OurClass(std::move(o)); // single copy
OurClass(SomeClass()); // single copy
Inconvénients: Un gaspillage de copie pour les rvalues.
Exemple 2 - C++0x?
OurClass::OurClass(const SomeClass& obj) : obj(obj) {}
OurClass::OurClass(SomeClass&& obj) : obj(std::move(obj)) {}
SomeClass o;
OurClass(o); // single copy
OurClass(std::move(o)); // zero copies, one move
OurClass(SomeClass()); // zero copies, one move
Avantages: sans doute le plus rapide.
Inconvénients: Beaucoup de code!
Exemple 3 - Passe-par-valeur + std::move
OurClass::OurClass(SomeClass obj) : obj(std::move(obj)) {}
SomeClass o;
OurClass(o); // single copy, one move
OurClass(std::move(o)); // zero copies, two moves
OurClass(SomeClass()); // zero copies, one move
Avantages: Pas de code supplémentaire.
Inconvénients: Un gaspillage de se déplacer dans les cas 1 et 2. Les performances en souffriront grandement si SomeClass
n'a pas de constructeur de déplacement.
Qu'en pensez-vous? Est-ce correct? Est la charge de se déplacer, généralement, une perte acceptable lorsque comparée à l'avantage de code de réduction?