La raison en Herbe a dit ce qu'il dit, c'est parce que des cas comme celui-ci.
Disons que j'ai de la fonction A
qui appelle la fonction B
, ce qui appelle la fonction C
. Et A
passe d'une chaîne à travers B
et en C
. A
ne sait pas ou se soucient C
; tous A
connaît est - B
. C'est, C
est un détail d'implémentation de B
.
Disons que A est défini comme suit:
void A()
{
B("value");
}
Si B et C prendre à la chaîne par const&
, alors qu'il ressemble à quelque chose comme ceci:
void B(const std::string &str)
{
C(str);
}
void C(const std::string &str)
{
//Do something with `str`. Does not store it.
}
Tout cela est bien beau. Que vous soyez simplement de passage de pointeurs autour de, pas de la copie, rien ne bouge, tout le monde est heureux. C
prend un const&
car elle permet de ne pas stocker la chaîne. Il utilise simplement.
Maintenant, je veux faire un simple changement: C
des besoins de stockage de la chaîne, quelque part.
void C(const std::string &str)
{
//Do something with `str`.
m_str = str;
}
Bonjour, constructeur de copie et le potentiel de l'allocation de mémoire ignorer (SSO). C++11 de la sémantique de déplacement sont censés faire il possible de supprimer l'inutile copie de la construction, droit? Et A
passe temporaire; il n'y a aucune raison pourquoi C
devrait avoir à copier les données. Il faut juste s'enfuir avec ce qui a été donné à elle.
Sauf qu'il ne peut pas. Parce qu'il prend un const&
.
Si je change C
de prendre son paramètre par valeur, que des causes justes B
faire la copie dans ce paramètre; je ne gagnez rien.
Donc, si j'avais passé juste str
, en valeur, à travers toutes les fonctions, en s'appuyant sur std::move
aléatoire les données autour de nous, nous n'aurions pas ce problème. Si quelqu'un veut la garder, ils le peuvent. S'ils ne le font pas, oh bien.
Est-il plus cher? Oui; le déplacement d'une valeur est plus cher que l'aide de références. Est-il moins cher que la copie? Pas pour les petites chaînes de l'authentification unique. Est-ce la peine de le faire?
Cela dépend de votre cas d'utilisation. Combien avez-vous de la haine des allocations de mémoire?