2010-05-12 3 views
15

Est-il valide de stocker la valeur de retour d'un objet dans une référence?Enregistrer la valeur de retour de la fonction dans la référence C++

class A { ... }; 
A myFunction() 
{ 
    A myObject; 
    return myObject; 
} //myObject goes out of scope here 

void mySecondFunction() 
{ 
    A& mySecondObject = myFunction(); 
} 

Est-il possible de le faire afin d'éviter la copie myObject à mySecondObject? myObject n'est plus nécessaire et devrait être exactement le même que mySecondObject donc il serait en théorie plus rapide de simplement passer la propriété de l'objet d'un objet à un autre. (Ceci est également possible en utilisant le pointeur partagé boost mais qui a le surcoût du pointeur partagé.)

Merci d'avance.

Répondre

19

Il n'est pas autorisé de lier le temporaire à une référence non-const, mais si vous créez votre référence const, vous étendez la durée de vie du temporaire à la référence, voir this Danny Kalev post about it.

En bref:

const A& mySecondObject = myFunction(); 
+1

Savez-vous pourquoi cela n'est pas autorisé? – Mehrdad

+0

Je ne suis pas sûr mais je devine que la raison est qu'autoriser une référence non-const signifierait que le compilateur serait nécessaire pour déterminer quand la référence est réaffectée. Je pense que cela est normalement considéré comme faisant partie de l'analyse de la portée dynamique et non utilisé dans la norme C++. Dans le cas de const, en revanche, seule la durée de vie statique de la référence doit être déterminée. Cette analyse est probablement déjà requise dans d'autres cas et a donc été jugée acceptable. –

+0

On peut également noter qu'il s'agit d'une fonction de suivi de pointeur assez simpliste, et que l'on pourrait imaginer un système plus avancé. Mais en général, je crois que C++ veut éviter ce problème et le déléguer au programmeur à la place. C'est ce que les pointeurs intelligents sont pour. –

3

Il est possible avec une référence const.

myFunction retourne par valeur, de sorte que la valeur de retour est un objet temporaire. Vous pouvez lier un temporaire à une référence const, et la durée de vie du temporaire est étendue à la durée de vie de la référence. Vous ne pouvez pas lier un temporaire à une référence non-const (malheureusement).

La valeur de retour de myFunction peut être une copie de myObject. Du côté positif, l'élision du constructeur de copie (alias "l'optimisation de la valeur de retour" dans ce cas) permet au compilateur de construire myObject directement dans le temporaire qui est la valeur de retour de myFunction, vraisemblablement situé quelque part sur la pile du code appelant. Si c'est le cas, alors quand myObject sort de la portée, l'objet n'est pas réellement détruit. L'optimisation est généralement implémentée - par exemple GCC (habituellement?) Le fait même sans indicateurs d'optimisation.

Copie cteur élision permet également le compilateur pour éviter toute copie si vous avez:

A mySecondObject = myFunction(); 

Cela nécessite l'application des deux types juridiques de copie cteur élision: (1) le retour d'une valeur nommée d'une fonction, et (2) initialiser un objet à partir d'un temporaire.

5

Vous pourriez être intéressé par le return-by-value optimization que beaucoup de compilateurs font pour éviter d'appeler le constructeur de copie.

+0

C'est l'une de ces idées que je cherche. Je ne peux pas visiter la page mais je crois que https://en.wikipedia.org/wiki/Copy_elision#Return_value_optimization serait similaire. – konsolebox

Questions connexes