Maison  >  Article  >  développement back-end  >  Passage par valeur ou référence : quand est-ce que « Vous voulez de la vitesse ? Passer par valeur » est-il réellement vrai ?

Passage par valeur ou référence : quand est-ce que « Vous voulez de la vitesse ? Passer par valeur » est-il réellement vrai ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-27 01:34:03448parcourir

  Passing by Value or Reference: When is

"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) :

  • Lvalues : X et Y effectueront tous deux une copie (en X lors de l'initialisation de name, dans Y lors de l'initialisation de mem_name), suivi d'une opération de déplacement dans X.
  • Rvalues : X ne peut effectuer un mouvement que si RVO peut être appliqué, alors que Y nécessite toujours une copie.

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!

Déclaration:
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