64 votes

Quelle est la meilleure façon de rétablir la chaîne en C++?

Ma question est simple: si j'ai un peu de classe Homme et je veux définir une fonction membre qui renvoie nom de l'homme, lequel de ces deux variantes est que je préfère?

D'abord:

string name();

Deuxième:

void name(/* OUT */ string &name);

La première variante est une sorte de inefficace, car elle rend inutiles les copies (variable locale -> retour -> variable dans la partie gauche de l'affectation).

La deuxième variante à l'air assez efficace, mais il me fait pleurer à écrire

string name;
john.name(name);

au lieu d'une simple

string name(john.name());

Alors, quelle variante est que je préfère et ce qui est le bon compromis entre l'efficacité et la commodité et la lisibilité?

Merci à l'avance.

52voto

Mahmoud Al-Qudsi Points 14815

C'est une bonne question et le fait que vous demandez cela montre que vous êtes en accordant une attention à votre code. Cependant, la bonne nouvelle, c'est que dans ce cas particulier, il y a une solution facile.

La première, propre méthode est la bonne façon de faire. Le compilateur va supprimer les copies (web archive copie de l'article), dans la plupart des cas (généralement où il fait sens).

25voto

juanchopanza Points 115680

l'utilisation de la première variante:

string name();

Le compilateur le plus susceptible d'optimiser toutes les recopies inutiles. Voir la valeur de retour d'optimisation.

En C++11, la sémantique de déplacement signifie que vous n'avez pas à effectuer une copie complète, même si le compilateur n'effectue pas de RVO. Voir la sémantique de déplacement.

Aussi garder à l'esprit que si l'alternative est

void name(std::string& s);

il vous faudra alors préciser très clairement ce qui peut arriver à l' s et des valeurs qu'elle peut avoir lorsqu'il est passé à la fonction, et probablement faire beaucoup de vérification de la validité, ou tout simplement écraser l'entrée entièrement.

9voto

olchauvin Points 2215

Puisque vous voulez créer un getter pour un champ de votre classe, vous devriez peut-être aller comme ça: inline const std::string& name() const { return this->name; }

Puisque le nom est retourné comme une référence const, il ne sera pas modifié en dehors de la classe, aussi aucune copie ne sera créé en retournant le nom.

Après, si vous voulez manipuler le nom que vous aurez à faire une copie.

5voto

kisplit Points 1043

Je voudrais aller avec le premier. Valeur de retour d'optimisation et de C++11 va supprimer toute copie de frais généraux.

2voto

Nawaz Points 148870

Comme nous l'avons déplacez-sémantique (en C++11), vous pouvez utiliser ceci:

string name();

Même en C++03, c'est presque bon, comme le compilateur peut optimiser ce (Recherche de la Valeur de Retour d'Optimisation).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X