"Vous voulez de la vitesse ? Passer par la valeur" - Explorer les implications en matière de performances
La déclaration de Scott Meyers "Vous voulez de la vitesse ? Passer par la valeur" soulève des questions sur les avantages en termes de performances du passage d'objets par valeur plutôt que par référence. Dans ce contexte, le passage par valeur implique une opération de copie, tandis que le passage par référence évite les copies inutiles.
Considérons l'exemple suivant avec les structures X et Y :
<code class="cpp">struct X { std::string mem_name; X(std::string name) : mem_name(std::move(name)) {} }; struct Y { std::string mem_name; Y(const std::string &name) : mem_name(name) {} };</code>
Dans le constructeur de X, le Le nom de l'argument est copié dans un objet temporaire avant d'appeler le constructeur de déplacement sur std::string pour initialiser mem_name. Dans le constructeur de Y, le nom de l'argument est une référence const, mais une copie est toujours effectuée pour initialiser mem_name. Par conséquent, X effectue une opération « copier puis déplacer », tandis que Y effectue une seule copie.
Selon l'argument de Meyers, il semblerait que le passage par valeur (comme dans X) pourrait être plus rapide en raison de le potentiel d'optimisation, comme l'optimisation de la valeur de retour (RVO). Cependant, un examen plus approfondi révèle que le résultat dépend du type d'argument transmis (lvalue ou rvalue) :
Généralement, un déplacement est plus rapide que le passage d'un pointeur, ce qui est essentiellement ce que fait le passage par référence. Par conséquent, pour les rvalues, X fonctionne mieux que Y, tandis que pour les lvalues, les performances sont similaires.
Il est important de noter qu'il ne s'agit pas d'une règle universelle et que les optimisations peuvent varier en fonction du compilateur et de la plateforme. Le profilage est recommandé pour déterminer l'approche optimale dans des cas spécifiques.
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!