Question

Supposons que j'ai le code suivant:

class some_class{};

some_class some_function()
{
    return some_class();
}

Cela semble fonctionner plutôt bien et me permet de ne pas avoir à déclarer une variable uniquement pour générer une valeur de retour. Mais je ne pense pas avoir jamais vu cela dans un tutoriel ou une référence. Est-ce une chose spécifique au compilateur (Visual C ++)? Ou est-ce que cela fait quelque chose de mal?

Était-ce utile?

La solution

Non, cela est parfaitement valide. Cela sera également plus efficace, car le compilateur est en mesure d’optimiser le temporaire.

Autres conseils

Le renvoi d'objets à partir d'un appel de fonction est le "Factory". Design Pattern, et est largement utilisé.

Cependant, vous voudrez être prudent si vous renvoyez des objets ou des pointeurs sur des objets. Le premier d'entre eux vous initiera à copier les constructeurs / opérateurs d'assignation, ce qui peut être une douleur.

C’est valide, mais les performances risquent de ne pas être optimales en fonction de la façon dont on l’appelle.

Par exemple:

A a;
a = fn();

et

A a = fn();

ne sont pas les mêmes.

Dans le premier cas, le constructeur par défaut est appelé, puis l'opérateur d'affectation est appelé sur un qui nécessite la construction d'une variable temporaire.

Dans le second cas, le constructeur de copie est utilisé.

Un compilateur assez intelligent déterminera quelles optimisations sont possibles. Mais, si le constructeur de copie est fourni par l'utilisateur, je ne vois pas comment le compilateur peut optimiser la variable temporaire. Il doit appeler le constructeur de copie et, pour ce faire, il doit avoir une autre instance.

La différence entre l'exemple de Rob Walker s'appelle Optimisation de la valeur de retour (RVO) si vous souhaitez y rechercher Google.

Incidemment, si vous voulez que votre objet soit renvoyé de la manière la plus efficace, créez-le sur le tas (c.-à-d. via new) en utilisant un shared_ptr et renvoyez plutôt un shared_ptr. Le pointeur est renvoyé et la référence compte correctement.

C ++ est parfaitement raisonnable.

C ++ est parfaitement légal et tout compilateur devrait l’accepter. Qu'est-ce qui vous fait penser que quelque chose ne va pas?

C’est la meilleure façon de le faire si votre classe est assez légère. Je veux dire qu’il n’est pas très coûteux d’en faire une copie.

L’un des effets secondaires de cette méthode est cependant qu’elle a tendance à rendre plus probable la création d’objets temporaires, bien que cela puisse dépendre de la capacité du compilateur à optimiser les choses.

Pour les classes plus épaisses dont vous voulez vous assurer qu'elles ne sont pas copiées (par exemple, une grande image bitmap), il est conseillé de passer ce genre de chose comme paramètre de référence qui sera ensuite rempli, il suffit de faire absolument sûr qu'il n'y aura pas d'objets temporaires créés.

Dans l’ensemble, il peut arriver que la simplification de la syntaxe et la transformation directe des choses entraînent la création d’objets temporaires supplémentaires dans les expressions, ce que vous devez garder à l’esprit lors de la conception des interfaces pour des objets plus lourds.

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