Maison > développement back-end > C++ > Le passage de `std::string` par `const std::string&` est-il toujours bénéfique en C moderne ?

Le passage de `std::string` par `const std::string&` est-il toujours bénéfique en C moderne ?

Susan Sarandon
Libérer: 2024-12-22 05:38:14
original
664 Les gens l'ont consulté

Is Passing `std::string` by `const std::string&` Still Beneficial in Modern C  ?

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;
}
Copier après la connexion

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.
}
Copier après la connexion

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal