69 votes

Retourne la copie de relevé des valeurs

Je me pose des questions sur ce à cause de la question de la portée. Par exemple, considérez le code

typedef struct {
    int x1;/*top*/
    int x2;/*bottom*/
    int id;
} subline_t;



subline_t subline(int x1, int x2, int id) {
    subline_t t = { x1, x2, id };
    return t;
}

int main(){
    subline_t line = subline(0,0,0); //is line garbage or isn't it? the reference
    //to subline_t t goes out of scope, so the only way this wouldn't be garbage
    //is if return copies
}

Donc ma question est, sera le retour à la déclaration de toujours copier? Dans ce cas, il semble fonctionner, je suis donc amené à croire que le retour ne copie. Si elle ne copie, il copie dans tous les cas?

49voto

Greg Hewgill Points 356191

Oui, dans ce cas, il y aura une copie. Si vous modifiez la déclaration de la fonction comme ceci:

subline_t &subline(int x1, int x2, int id) {

alors aucune photocopie ne sera faite. Cependant, dans votre cas particulier, il ne serait pas valide pour renvoyer une référence à un objet alloué sur la pile. Le problème est que l'objet serait détruite, et invalidé avant que l'appelant avait une chance de l'utiliser.

Ceci est lié à la commune de la Valeur de Retour d'Optimisation pour le C++ qui peuvent éviter de faire une opération de copie réelle dans le cas que vous avez décrit. Le résultat final est (ou devrait être) le même que si une copie a été effectuée, mais vous devez être conscient de l'optimisation. La présence de cette optimisation peut, dans certains cas, modifier le comportement observable du programme.

4voto

Tom Points 16783

Dans votre cas , il sera de retour une copie

Si votre code a été

subline_t& subline(int, int)

ensuite, il serait de retour d'une référence, ce qui donnerait dans un comportement indéterminé.

3voto

Alex Martelli Points 330805

Oui, pour une fonction déclarée pour retourner un struct, return d'une telle structure de la copie (même si le compilateur est habilité à optimiser la copie à l'écart, essentiellement dans les cas où il peut prouver l'optimisation est sémantiquement inoffensif, vous pouvez raisonner "comme si" la copie a été garanti).

Cependant, puisque vous n' tag ce que C++, pas du C, pourquoi ne pas fournir votre struct avec un constructeur, au lieu...? Semble plus clair et plus direct...!-)

2voto

Andrew Keith Points 5627

oui , le retour est une copie

subline_t subline(int x1, int x2, int id) {
        subline_t t = { x1, x2, id };
        return t;
}

Si vous mettez un referencer, alors ce n'est pas une copie

subline_t & subline(int x1, int x2, int id) {
        subline_t t = { x1, x2, id };
        return t; // will result in corruption because returning a reference
}

2voto

csj Points 3385

Il retournera toujours une copie.

Si vous voulez éviter l'impact sur les performances de la copie de l'objet sur le retour, vous pouvez déclarer un pointeur, créer une instance de l'objet à l'aide de nouvelles, et de renvoyer le pointeur. Dans ce cas, le pointeur va être copiée, mais l'objet ne sera pas.

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