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.
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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 &&.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Temps pour construire b1 : 0.81195 Temps pour construire b2 : 1e-06
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![]()
Partager