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?