2009-12-11 6 views
18

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

+0

Pourquoi? C'est-à-dire, qu'espérez-vous accomplir avec cette connaissance? – wallyk

+0

duplicata possible: http://stackoverflow.com/questions/1567138/const-t-arg-vs-t-arg –

+0

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. –

Répondre

30

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)

+5

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). –

+4

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. –

+0

Comment ça? – GManNickG

2

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.

Questions connexes