Maison > développement back-end > C++ > Devriez-vous transmettre `std::string` et `std::vector` par valeur ou référence Const ?

Devriez-vous transmettre `std::string` et `std::vector` par valeur ou référence Const ?

Susan Sarandon
Libérer: 2024-12-29 00:22:10
original
736 Les gens l'ont consulté

Should You Pass `std::string` and `std::vector` by Value or Const Reference?

Passer des paramètres par valeur : repenser const std::string &

Herb Sutter a récemment remis en question la pratique conventionnelle consistant à passer std::vector et objets std::string par référence const. Il suggère que dans de nombreux cas, les transmettre par valeur est désormais préférable, comme le démontre le code suivant :

std::string do_something(std::string inval) {
  std::string return_val;
  // ... do stuff ...
  return return_val;
}
Copier après la connexion

Alors que la valeur de retour est une rvalue au point de retour de la fonction et peut être déplacée au coût- en fait, la justification de la déclaration de Sutter réside dans des cas comme celui-ci :

Considérons une fonction A qui invoque la fonction B, qui à son tour appelle la fonction C. A passe un paramètre de chaîne à B, qui la transmet à C. A n'a aucune connaissance directe de C.

Si B et C prennent la chaîne par référence const, le code apparaîtrait comme suit :

void B(const std::string &str) {
  C(str);
}

void C(const std::string &str) {
  // Process `str` without storing it.
}
Copier après la connexion

Avec cette approche, passer et recevoir des pointeurs suffit, évitant ainsi une copie ou un déplacement coûteux.

Cependant, si C doit stocker le string :

void C(const std::string &str) {
  // Process `str`.
  m_str = str;
}
Copier après la connexion

Cela déclenche un constructeur de copie et une allocation potentielle de mémoire (en ignorant l'optimisation des chaînes courtes). Alors que la sémantique de déplacement de C 11 vise à éliminer les copies inutiles, C prenant une référence const l'empêche, malgré le passage d'une chaîne temporaire par A.

À l'inverse, si str était transmis par valeur à travers toutes les fonctions, en s'appuyant sur la sémantique de déplacement pour transférer propriété, C pourrait soit adopter, soit supprimer les données sans provoquer d’opération de copie. Cette approche entraîne une légère surcharge de performances, mais elle élimine les allocations de mémoire, ce qui peut être avantageux selon le 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