Maison >développement back-end >C++ >Devrions-nous encore passer std::string par const & ?
L'ère révolue de Const Std::string & Parameters
Dans une discussion récente, Herb Sutter a soulevé l'idée que la pratique dominante de passer std::vector et std::string par const & le paramètre peut ne plus avoir le même poids. L'alternative qu'il propose, passant ces objets par valeur, a suscité des débats et soulevé des questions.
Comprendre la transition
Pourquoi Sutter a-t-il préconisé ce changement ? La raison principale réside dans des scénarios similaires à celui décrit ci-dessous :
Considérons une fonction A qui appelle la fonction B, qui à son tour appelle la fonction C. La fonction A fait passer une chaîne via B et dans C, maintenant son inconscience de L'existence de C.
La const et l'approche :
Lorsque B et C reçoivent la chaîne en tant que const et paramètres, les interactions se produisent comme suit :
void B(const std::string &str) { C(str); } void C(const std::string &str) { // Manipulates `str` but does not store it. }
Cette approche fait circuler efficacement les pointeurs, évitant ainsi les copies ou les mouvements inutiles. C accepte const & parce qu'il a uniquement l'intention d'utiliser la chaîne, pas de la stocker.
L'approche valeur :
Cependant, si la fonctionnalité de C l'exige pour stocker la chaîne , la modification suivante est apportée :
void C(const std::string &str) { // Manipulates `str`. m_str = str; }
Comme vous pouvez le constater, C n'utilise plus simplement la chaîne mais la stocke également. La sémantique de déplacement de C 11 devrait théoriquement éliminer les copies inutiles, mais le paramètre const & de C l'empêche. Le constructeur de copie et l'allocation potentielle de mémoire entrent en jeu à la place.
Contourner Const & :
Contourner le paramètre const & et passer la chaîne par valeur à travers toutes les fonctions élimine ce problème. problème. std::move peut mélanger efficacement les données si nécessaire. Si une fonction a l'intention de conserver la chaîne, elle peut le faire.
Considérations relatives aux performances :
Le passage par valeur entraîne une dépense de performances plus élevée que l'utilisation de références. Cependant, pour les petites chaînes bénéficiant du SSO, le coût est négligeable.
Conclusion
La décision de passer ou non std::string par const & ou value dépend le cas d'utilisation spécifique et sa sensibilité aux allocations de mémoire. Bien que le recours à la valeur ne soit pas universellement préférable, il offre des avantages convaincants dans certaines situations.
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!