2010-11-06 18 views
0

J'ai une question sur la performance du constructeur de mouvement, classe pseudo C++:Performance du constructeur de l'objet de déplacement avec un membre de tuple

typedef tuple<std::string, std::vector<double>, ...and more...> FooTupleMember; 

class Foo1 
{ 
    public: 
     Foo1::Foo1 (Foo1&& object) : 
      member (std::move (object.member)) 
     { 
      // ... 
     } 
    private: 
     FooTupleMember member; 
}; 

class Foo2 
{ 
    public: 
     Foo2::Foo1 (Foo2&& object) : 
      member (std::move (object.member)) 
     { 
      // ... 
     } 
    private: 
     std::unique_ptr<FooTupleMember> member; 
}; 

Lorsque je déplace l'objet de Foo1 classe, il initialise les constructeurs de mouvement de tous les objets stocké dans tuple droit? Cela signifie que cette opération de déménagement peut être assez coûteuse.

Mais je déplace l'objet de Foo2 opération de mouvement de classe entière est beaucoup plus rapide parce que je ne passe que le pointeur interne de données stockées dans le pointeur intelligent, non?

La référence de valeur R est plus rapide que la valeur de révérence, car les opérations de copie sont beaucoup moins nombreuses, ce qui est évident. Cependant renvoyer l'objet de la fonction en utilisant le constructeur de déplacement est encore plus cher que de stocker le même objet dans le pointeur intelligent et de retourner le pointeur intelligent.

Déplacer des objets via la valeur l est très lent, le déplacer via un pointeur intelligent est très rapide et le déplacer via la valeur r est quelque part au milieu.

Je ne vois pas "la puissance" de la valeur r, parce que ce n'est pas aussi efficace que beaucoup de gens le disent. Utilisation de pointeur intelligent au lieu de r-valeur est mieux à mon humble avis (je veux dire plus rapide) et le code élégant et clair. Ai-je raison?

Répondre

1

Si votre classe a beaucoup de membres, alors vous devez tous les déplacer (ou assez pour que le mouvement ait du sens). Cela va toujours être plus cher que de déplacer un seul pointeur (intelligent), mais est probablement moins cher que la copie. Toutefois, stocker vos données sur le tas pour pouvoir y accéder via un pointeur (pour accélérer le déplacement) affectera les performances du reste de votre code, puisque chaque accès doit déréférencer le pointeur.

Profil et optimiser les bits lents. Si le déplacement n'est pas un goulot d'étranglement, faites ce qui rend le reste de votre code plus rapide, et vice versa.