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; }
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. }
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; }
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!