Design, performances, rvalues et std::move
Bonjour,
J'ai une classe qui peut comporter d'importants volumes de données. Je peux la construire grâce à const std::vector<double> &v, constructeur ligne n°9 ci-dessous. Or cela engendre une copie qui peut être importante.
Et là j'ai découverts les rvalues et std::move, et je me rends compte que le constructeur ligne n°11 "déplace le vecteur std::vector<double> &&v en paramètre" et donc évite toute copie.
La classe plt::Clock est uniquement là pour mesurer un intervalle de temps en seconde.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include <iostream>
#include <vector>
#include <Plastic/Core/Clock.hpp>
struct BigStruct
{
BigStruct(const std::vector<double> &v) : m_data(v) {};
BigStruct(std::vector<double> &&v) : m_data(std::move(v)) {};
private:
std::vector<double> m_data;
};
int main()
{
plt::Clock c;
float time;
std::vector<double> v(200000000, 6.0);
c.reset();
BigStruct b1(v);
time = c.getElapsedTime();
std::cout << "Temps pour construire b1 : " << time << std::endl;
c.reset();
BigStruct b2( std::move(v) );
time = c.getElapsedTime();
std::cout << "Temps pour construire b2 : " << time << std::endl;
return 0;
} |
Sur Ubuntu x86-64, avec g++-4.6 et les options -03 -flto -lwhole-program j'obiens en sortie (j'obtiens le même résultat en relançant plusieurs fois le programme):
Code:
1 2
| Temps pour construire b1 : 0.81195
Temps pour construire b2 : 1e-06 |
1. Je me demande si c'est une bonne façon de faire le code ci-dessous pour le constructeur depuis une rvalue. En effet je laisse le choix à l'utilisateur mais je sais pas trop quoi en pense, je suis débutant avec ces &&.
2. Que puis-je savoir sur l'instance v une fois qu'elle a été "déplacé"? Reviens telle au constructeur par défaut? Où tout autre comportement spécifié par la norme.
Merci beaucoup :D