Question

Y at-il un cas où le passage par référence est plus cher que de passer par valeur en C ++? Si oui, qu'est-ce que ce cas être?

Était-ce utile?

La solution

préfèrent passer des types primitifs (int, char, float, ...) et POD struct qui ne coûtent pas cher à copier (Point, complexe) par la valeur.

Ce sera plus efficace que le indirection nécessaire lors du passage par référence.

Voir appel de caractères Boost.

  

Le call_traits<T> de classe modèle encapsule la « meilleure » méthode pour transmettre un paramètre d'un certain type T ou d'une fonction, et se compose d'une collection de définitions de types définis comme dans le tableau ci-dessous. Le but de call_traits est de faire en sorte que des problèmes tels que « les références à des références » ne se produisent et que les paramètres sont transmis de la manière la plus efficace possible.

Autres conseils

Vous pouvez lire cet article "Voulez-vous la vitesse? passer par la valeur " sur copie élision et RVO (retour par la valeur d'optimisation). Il explique que les références empêchent parfois le compilateur de les faire.

Oui, l'accès à un passé par l'argument de référence pourrait nécessiter plus de niveaux indirection qu'un passé par l'argument de valeur. Par ailleurs, il est peut-être être plus lent si la taille de l'argument est plus petite que la taille d'un pointeur. Bien sûr, il est tout en supposant que le compilateur ne l'optimiser.

Le compilateur peut optimiser le passage d'un type primitif par référence à simple passage par valeur, si le type est de la même taille ou plus petite que la taille d'une référence / pointeur. Il n'y a aucune garantie que le compilateur fera, donc si vous avez un choix, passer des types primitifs par valeur. Dans le code si basé sur un modèle, il faut souvent passer par référence de toute façon - considérer le push_back de vecteur qui prend une référence const. Si vous avez un vecteur de ints, vous seriez passer une référence à un type primitif. Dans cette situation, vous souhaiteriez le compilateur optimiserait qu'en substituant la référence d'une valeur. Comme le vecteur pourrait être stocker de grands types cependant, d'accepter une référence const est le meilleur choix.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top