Le passage de Const std::string & en tant que paramètre offre-t-il encore des avantages ?
Dans une récente conférence, le célèbre expert C Herb Sutter a suggéré que les arguments pour passer std :: vector et std :: string par const & ne sont plus convaincants. Pour illustrer, il a proposé une fonction écrite comme suit :
std::string do_something ( std::string inval ) { std::string return_val; // ... do stuff ... return return_val; }
Herb a estimé que, puisque return_val serait une rvalue au moment du retour de la fonction, elle pourrait être renvoyée en utilisant une sémantique de déplacement rentable. Cependant, la question demeure : pourquoi passer le paramètre d'entrée inval par référence ? La plus grande taille d'un objet std::string (en raison de composants tels que le pointeur de tas et le tableau de caractères) ne rend-elle pas le passage par valeur plus avantageux ?
Raison d'être de Herb
La suggestion de Herb découle de scénarios dans lesquels plusieurs fonctions imbriquées sont impliquées. Considérons une situation dans laquelle la fonction A appelle la fonction B, qui à son tour appelle la fonction C, chacune passant un paramètre de chaîne. Si B et C prennent la chaîne comme const &, le code pourrait ressembler à ceci :
void B(const std::string & str) { C(str); } void C(const std::string & str) { // Use `str` without storing it. }
Cette approche transmet efficacement les pointeurs, évitant ainsi la copie ou le déplacement. C prend un const & car il ne stocke pas la chaîne.
Cependant, supposons que C doive maintenant stocker la chaîne. Modifier C comme suit forcera B à effectuer une copie dans son paramètre, annulant tout avantage :
void C(const std::string & str) { // ... m_str = str; }
En revanche, si str était passé par valeur dans toutes les fonctions, en s'appuyant sur std::move to gérer le mouvement des données, C pourrait simplement accepter la propriété de la chaîne temporaire, éliminant ainsi le besoin de copies.
Coût Considérations
Bien que le passage par valeur entraîne une légère pénalité de performances par rapport à l'utilisation de références, cela peut être comparable au coût de copie de petites chaînes avec SSO. Le choix entre ces approches dépend de la fréquence des allocations de mémoire et du cas d'utilisation spécifique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!