L'obsolescence du passage const std::string& Références : le point de vue de Herb Sutter
Dans une récente conférence, Herb Sutter a exprimé la pertinence décroissante de en passant std :: vector et std :: string par const&. Il a suggéré que l'approche traditionnelle :
std::string do_something(const std::string& inval)
est désormais moins souhaitable que :
std::string do_something(std::string inval)
Bien qu'il soit reconnu qu'inval conserve sa taille, l'argument de Herb découle de scénarios impliquant un chaînage de fonctions. Prenons l'exemple où A appelle B, qui à son tour appelle C :
Cas 1 : Passage par const Reference
void B(const std::string& str) { C(str); } void C(const std::string& str) { /* Use str but do not store it */ }
Lorsque C nécessite un stockage, une opération de copie devient nécessaire :
void C(const std::string& str) { m_str = str; }
Cependant, l'utilisation de const& empêche C d'accéder aux données sous-jacentes déplacées dans son paramètre.
Cas 2 : Passage par valeur
void B(std::string str) { C(std::move(str)); } void C(std::string str) { m_str = std::move(str); }
Dans ce scénario, la chaîne est déplacée dans les appels de fonction, évitant ainsi les copies inutiles. La surcharge de performances liée au passage à une valeur est compensée par les avantages d'éviter les allocations de mémoire pour les petites chaînes avec l'optimisation des chaînes courtes (SSO).
En fin de compte, le choix entre le passage par référence const ou par valeur dépend de l'utilisation spécifique. cas et la préférence du développeur pour l'efficacité de l'allocation de mémoire par rapport aux inconvénients potentiels en termes de performances.
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!