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 : 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;
}
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
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