9
votes

Passer par référence plus cher que la valeur réussie

y a-t-il un cas où la référence passe-t-elle est plus chère que la valeur de réussite en C ++? Si oui, qu'est-ce que cette affaire serait-elle?


0 commentaires

4 Réponses :


5
votes

Oui, l'accès à une transmission d'un argument de référence peut nécessiter davantage de niveaux d'indirection qu'un argument de valeur transmis. En outre, il peut être plus lent si la taille de l'argument est inférieure à la taille d'un seul pointeur. Bien sûr, tout cela suppose que le compilateur ne l'optimise pas.


1 commentaires

Alors, comment peut-on savoir si son compilateur optimise cela?



15
votes

préférez passer des types primitifs de passage (int, char, flotteur, ...) et des structures de pod qui sont bon marché pour copier (point, complexe) par la valeur.

Ceci sera plus efficace que l'indirection requise lors du passage par référence.

voir Traits d'appel de Boost .

La classe de modèle call_traits encapsule la méthode "meilleure" pour transmettre un paramètre de type T à ou vers une fonction, et consiste en une collection de typeDEF définie comme dans le tableau ci-dessous. . Le but de call_traits est de s'assurer que des problèmes tels que "références aux références" ne se produisent jamais et que les paramètres sont transmis de la manière la plus efficace possible.


0 commentaires

7
votes

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


0 commentaires

1
votes

Le compilateur pourrait optimiser la transmission d'un type primitif par référence à simplement passer par la valeur, si le type est de la même taille ou inférieure à la taille d'une référence / pointeur. Rien ne garantit que le compilateur le fera, donc si vous avez le choix, passez des types primitifs par valeur. Dans le code modélisé cependant, vous devez souvent passer par référence quand même - considérez le push_back de vecteur qui prend une référence de const. Si vous avez un vecteur d'INTS, vous passeriez une référence à un type primitif. Dans cette situation, vous espéreriez que le compilateur optimiserait cela en substituant la référence avec une valeur. Étant donné que le vecteur pourrait bien stocker des types importants, l'acceptation d'une référence Const est le meilleur choix.


1 commentaires

"Le compilateur pourrait optimiser ..." Tant que la callee ne modifie pas l'appel-référence ou la lit après avoir appelé un code qui pourrait le modifier. Mais bien sûr dans les cas où cela le ferait, j'espère ne pas poser la question "qui est plus coûteux", plutôt "ce qui est correct" :-) Les malades sont des cas où vous pensez que le compilateur peut optimiser, mais en fait Je ne peux pas parce que vous avez négligé une raison quelconque, cela doit être une référence (règles d'aliasing étant la cause principale des surprises).