std::vector semble ne pas utiliser std::move, pourquoi ?
Bonjour a tous,
J'ai fait quelques tests en mettant des cout dans les constructeurs de copy et constructeurs move d'une classe Obj
J'ai ensuite fait plusieurs push back sur un vector<Obj>...
Et il semble que lors de la réallocation c'est a dire quand le vector "s'agrandit", le vector recopie les données plutôt que de les déplacer... Est-ce normal ?
Voici l'output de mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
first push back
constructing num1{} rvalue
constructing num1 from '' using move constructor
second push back
constructing num2{} rvalue
constructing num2 from '' using move constructor
constructing num1 from 'num1' using copy constructor
third push back
constructing num3{} rvalue
constructing num3 from '' using move constructor
constructing num2 from 'num2' using copy constructor
constructing num1 from 'num1' using copy constructor |
Voici le code du main :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
int main(int argc, const char * argv[])
{
vector<Obj> vect;
cout << endl << "first push back " << endl;
vect.push_back(Obj("num1"));
cout << endl << "second push back " << endl;
vect.push_back(Obj("num2"));
cout << endl << "third push back " << endl;
vect.push_back(Obj("num3"));
return 0;
} |
Enfin voici la classe Obj :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
class Obj{
string name;
public:
Obj(const string & nom) : name{nom} {
cout << "constructing " << name << "{" << nom << "} lvalue" << endl;
}
Obj(string&& nom) : name{move(nom)} {
cout << "constructing " << name << "{" << nom << "} rvalue" << endl;
}
Obj(const Obj& source) : name{source.name} {
cout << "constructing " << name << " from '" << source.name << "' using copy constructor" << endl;
}
Obj(Obj&& source) : name{move(source.name)}{
cout << "constructing " << name << " from '" << source.name << "' using move constructor" << endl;
}
}; |
Merci de votre réponse, je reformule ma question
Bonjour,
Merci pour votre réponse. Je pense que je n'ai pas été assez clair car ce n'était pas ma question :
Dans l'output, on voit (lors du troisième push-back ou du troisième emplace-back) que le vector ré-alloue son contenu pour s'agrandir, lorsqu'il le fait, on voit que ce sont les constructeurs de copie et non de déplacement qui sont appelés. Je ne comprend pas pourquoi.
cette partie :
constructing num3 from '' using move constructor
constructing num2 from 'num2' using copy constructor
constructing num1 from 'num1' using copy constructor
Note : J'ai modifié mon main pour utilise emplace_back (c'est plus propre), mais l'output ne change pas.
Voir :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
int main(int argc, const char * argv[])
{
vector<Obj> vect;
cout << endl << "first emplace back " << endl;
vect.emplace_back(Obj("num1"));
cout << endl << "second emplace back " << endl;
vect.emplace_back(Obj("num2"));
cout << endl << "third emplace back " << endl;
vect.emplace_back(Obj("num3"));
return 0;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
first emplace back
constructing num1{} rvalue
constructing num1 from '' using move constructor
second emplace back
constructing num2{} rvalue
constructing num2 from '' using move constructor
constructing num1 from 'num1' using copy constructor
third emplace back
constructing num3{} rvalue
constructing num3 from '' using move constructor
constructing num2 from 'num2' using copy constructor
constructing num1 from 'num1' using copy constructor |