Ce soir, j'ai été jeter un oeil à certaines de code que j'ai travaillé au cours des derniers jours, et a commencé à lire sur la sémantique de déplacement, plus précisément std::move. J'ai quelques questions à vous poser des pros pour s'assurer que je suis sur la bonne voie et de ne pas prendre de stupide hypothèses!
Tout d'abord:
1) a l'Origine, mon code a une fonction qui a donné un grand vecteur:
template<class T> class MyObject
{
public:
std::vector<T> doSomething() const;
{
std::vector<T> theVector;
// produce/work with a vector right here
return(theVector);
}; // eo doSomething
}; // eo class MyObject
Compte tenu de "theVector" est temporaire dans cette et "jeter", j'ai modifié la fonction de:
std::vector<T>&& doSomething() const;
{
std::vector<T> theVector;
// produce/work with a vector right here
return(static_cast<std::vector<T>&&>(theVector));
}; // eo doSomething
Est-ce correct? Tout pièges en faisant de cette façon?
2) j'ai remarqué dans une fonction que j'ai que des retours std::string
automatiquement appelé le constructeur de déplacement. Le débogage dans le Retour de la Chaîne (merci, Aragorn), j'ai remarqué qu'il appelle explicitement un constructeur de déplacement. Pourquoi est-il un pour la classe string et pas de vecteur?
Je n'ai pas à apporter des modifications à cette fonction pour prendre avantage de la sémantique de déplacement:
// below, no need for std::string&& return value?
std::string AnyConverter::toString(const boost::any& _val) const
{
string ret;
// convert here
return(ret); // No need for static_cast<std::string&&> ?
}; // eo toString
3) Enfin, je voulais faire des tests de performance, est le très-rapide des résultats que j'ai obtenu en raison de std::move sémantique ou fait de mon compilateur (VS2010) faire une optimisation de trop?
(Mise en œuvre de l' _getMilliseconds()
omis par souci de concision)
std::vector<int> v;
for(int a(0); a < 1000000; ++a)
v.push_back(a);
std::vector<int> x;
for(int a(0); a < 1000000; ++a)
x.push_back(a);
int s1 = _getMilliseconds();
std::vector<int> v2 = v;
int s2 = _getMilliseconds();
std::vector<int> v3 = std::move(x);
int s3 = _getMilliseconds();
int result1 = s2 - s1;
int result2 = s3 - s2;
Les résultats ont été, de toute évidence, génial. result1, d'une affectation standard, a pris 630ms. Le deuxième résultat, a été 0ms. Est-ce un bon test de performance de ces choses?
Je sais que certains de ce qui est une évidence pour beaucoup d'entre vous, mais je veux m'assurer de comprendre la sémantique juste avant d'aller me blazer sur mon code.
Merci à l'avance!