Je me demande si la chaîne C++ est considérée comme suffisamment petite pour être plus efficace lorsqu'elle est transmise par valeur que par référence.Passage de chaînes C++ par valeur ou par référence
Répondre
n ° Faites passer par référence:
void foo(const std::string& pString);
En général, les choses passent par référence si elles ont un non-trivial copie constructeur, sinon par valeur.
Une chaîne se compose généralement d'un pointeur vers des données et d'un compteur de longueur. Il peut en contenir plus ou moins, puisque son implémentation est définie, mais il est hautement improbable que votre implémentation n'utilise qu'un seul pointeur.
En code de modèle, vous pouvez également utiliser const T&
, puisque la définition de la fonction sera disponible pour le compilateur. Cela signifie qu'il peut décider s'il doit être une référence ou non pour vous. (Je pense)
Votre heuristique ne fonctionne pas pour 'double' et' long double' (qui valent normalement mieux d'être passés par valeur). De même, pour les fonctions à un seul argument, il est généralement préférable de transmettre deux UDT de mot machine par valeur, car les registres seront utilisés pour stocker les deux parties (et enregistrer une indirection supplémentaire). –
En outre, 'sizeof (T)' est une mesure très médiocre, ne serait-ce que parce qu'elle ne mesure pas la taille réelle des données qui seront copiées. 'string' est un exemple particulièrement parlant de cela, car' sizeof (string) 'sera typiquement' sizeof (void *) 'sur une implémentation naïve (un simple pointeur sur les données), ou deux ou trois mots sur l'optimisation de la chaîne courte la mise en oeuvre. Pourtant, lorsque vous copiez une chaîne, son constructeur de copie va copier les données pointées, ce qui est inexpliqué. Idem pour 'vector', et beaucoup d'autres. –
Comment ça? – GManNickG
Certainement pas. À moins que votre implémentation particulière n'ait une sémantique copy-on-write (rare en raison de problèmes de threading), la chaîne entière doit être copiée lorsqu'elle est passée par valeur (même si les données de chaîne sont stockées sur le tas). Même si l'objet chaîne n'est lui-même qu'un couple de pointeurs en interne, la quantité de données à copier est linéaire dans la longueur de la chaîne.
- 1. Passer enum par valeur ou référence?
- 2. Blocs de capture C++ - Intercepter l'exception par valeur ou référence?
- 3. Recursion et passage par référence
- 4. Notation inhabituelle de passage par référence?
- 5. Fonction PHP, retour par valeur ou par référence?
- 6. Traitement des données par référence ou par valeur dans python
- 7. Référence JavaScript par valeur/par problème de référence
- 8. C++ performance de la primitive de retour par valeur ou par référence (const)
- 9. C++ passage par référence: erreur: aucune fonction correspondante pour l'appel
- 10. C++ passe par le programme de référence
- 11. Partage d'un objet par référence ou par un pointeur
- 12. Java est passée par la valeur et le passage par référence Les deux
- 13. par référence en C++
- 14. C++ - Arguments optionnels par référence
- 15. Passage d'un tableau C# de structures avec un tableau de double membre en C par référence
- 16. .NET conteneurs - quand sont membres Par référence, par valeur?
- 17. Passage C# int et chaîne par référence à C++ ActiveX Control: incompatibilité de type
- 18. Passant pointeur argument par référence sous C?
- 19. C# passage simple comme référence
- 20. Java, passer par valeur, les variables de référence
- 21. Passage bool par référence en utilisant SWIG et Python
- 22. C# Copier tableau par valeur
- 23. Retour par référence en C#?
- 24. Appel par référence en C++
- 25. Java passe par référence ou valeur à C lors de l'utilisation JNI (plus spécifiquement Android NDK)
- 26. Un outil pour déterminer le moyen le plus efficace de transmettre des données, par référence ou par valeur?
- 27. Passer par référence impossible?
- 28. NSArray/NSMutableArray: Passé par réf ou par valeur?
- 29. Passage de types de données primitifs par référence dans Objective C
- 30. Valeur par rapport à la référence
Pourquoi? C'est-à-dire, qu'espérez-vous accomplir avec cette connaissance? – wallyk
duplicata possible: http://stackoverflow.com/questions/1567138/const-t-arg-vs-t-arg –
Bien que cela implique le voyage dans le temps, je dirais que cela devrait maintenant être marqué comme un doublon de [Sont les jours de passer const std :: string & en tant que paramètre sur?] (https://stackoverflow.com/questions/10231349/are-the-days-of-passing-const-stdstring-as-a-parameter-over), qui est la discussion canonique de cette question en termes de C++ moderne. –