IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Retour fonction


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 127
    Points : 124
    Points
    124
    Par défaut Retour fonction
    Bonjour!

    Encore et toujours la préparation de mon examen... (j'arrive tout doucement à la fin!) ;-)

    Que se passe-t-il lorsqu'on retourne dans une fonction une variable locale et que la fonction a pour type de retour une référence ? Que faudrait-il faire pour solutionner ce problème ? Donner un exemple.
    Tout d'abord cette question me fait me demander :
    Pourquoi ceci fonctionne-il?
    Si je fais une simple surcharge de l'opérateur +:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    monObj& operator+(int ajout)
    {
         monObj temp(*this);
         temp.prix=temp.prix+ajout;
         return temp;
    }
    Je renvois une référence vers un objet local à la fonction, qui va donc être détruit, pourtant mon programme fonctionne très bien! ... ?
    Encore merci pour votre aide!
    Mon blog sur Ruby on Rails : 2dconcept

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ca fonctionne car tu as de la chance, en théorie tu as un comportement indéterminé si tu fais ça. Cependant si tu règles bien ton compilo il devrait te jeter un petit warning à propos de ce genre de manip.

  3. #3
    Membre habitué
    Profil pro
    Enculeur de mouches
    Inscrit en
    Septembre 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Enculeur de mouches

    Informations forums :
    Inscription : Septembre 2003
    Messages : 133
    Points : 161
    Points
    161
    Par défaut Re: Retour fonction
    Citation Envoyé par Mookie
    Pourquoi ceci fonctionne-il?
    Car la mémoire alloué en pile, bien que désallouée à la sortie de la fonction, est toujours physiquement présente (encore heureux!) qu'elle appartient toujours au processus et qu'elle n'a pas été écrasée par d'autres valeurs entre temps.

    Fait deux "+" différents consécutifs, ensuite lit l'info pertinante dans le premier objet retourné :
    si je me suis pas vautré, tu dois obtenir la valeur correspondant au deuxième "+".
    Gaïa n'est pas une marchandise.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    Merci!
    Mon blog sur Ruby on Rails : 2dconcept

  5. #5
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    et pour solutionner le problème il faut soit renvoyer le résultat directement par valeur, soit utiliser un objet externe à la fonction (un objet qui reste alloué lorsque l'on quitte la fonction).

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    Ou utiliser une variable dynamique dans la fonction non?
    Mon blog sur Ruby on Rails : 2dconcept

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Points : 43
    Points
    43
    Par défaut
    A noter que le passage du resultat par valeur n'a en general pas d'influence nefaste sur les performances car le compilateur a le droit de creer celui ci directement dans le contexte appelant et evite ainsi la copie

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Mookie
    Ou utiliser une variable dynamique dans la fonction non?
    A éviter, car dans ce cas il faudra que l'appelant n'oublie pas de détruire celle-ci. Et dans ce cas il faut retourner un pointeur, non une référence (c'est pareil au niveau du comportement, mais... autant rester sur les références).

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par dok3
    A noter que le passage du resultat par valeur n'a en general pas d'influence nefaste sur les performances car le compilateur a le droit de creer celui ci directement dans le contexte appelant et evite ainsi la copie
    Si tu parles de la RVO, ce n'est possible que sous certaines conditions.

  10. #10
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    ou utiliser une variable dynamique (attention aux fuites mémoire !), et il doit y avoir encore d'autres solutions...

    @ dok3 : tu es sûr de ce que tu affirmes ? ça dépend surement des compilos et du niveau d'optimisation choisi, non ?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    Ok, merci pour ces précisions!
    Mon blog sur Ruby on Rails : 2dconcept

  12. #12
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Loulou24
    Citation Envoyé par dok3
    A noter que le passage du resultat par valeur n'a en general pas d'influence nefaste sur les performances car le compilateur a le droit de creer celui ci directement dans le contexte appelant et evite ainsi la copie
    Si tu parles de la RVO, ce n'est possible que sous certaines conditions.
    Justement j'aimerai bien savoir dans quels cas le compilateur n'arrive pas a le faire. J'ai bien fait quelques tests mais je n'ai pas reussi a mettre la RVO en defaut chez moi (gcc 2.96 et 3.3.3)

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En général pour permettre la RVO il faut construire la variable renvoyée directement sur la ligne du return. Mais j'imagine que ça dépend fortement du compilo.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <iostream>
     
    using namespace std;
     
    struct A
    {
        A() {cout << "constructeur par defaut" << endl;}
        A(const A&) {cout << "constructeur par copie" << endl;}
    };
     
    A PasOptimisee()
    {
        A a;
        return a;
    }
     
    A Optimisee()
    {
        return A();
    }
     
    int main()
    {
        cout << "Pas optimisee :" << endl;
        A a1 = PasOptimisee();
        cout << endl;
     
        cout << "Optimisee :" << endl;
        A a2 = Optimisee();
        cout << endl;
     
        return 0;
    }
    Pas optimisee :
    constructeur par defaut
    constructeur par copie

    Optimisee :
    constructeur par defaut

  14. #14
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Points : 43
    Points
    43
    Par défaut
    en effet avec ton code sur gcc 3.3.3 et en -g j'ai
    Pas optimisee :
    constructeur par defaut

    Optimisee :
    constructeur par defaut
    par contre en gcc 2.96 j'ai comme toi

    CQFD

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Retour fonction open
    Par viscere dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/08/2007, 16h09
  2. retour fonction erreur execution 91
    Par samtheh dans le forum VBA Access
    Réponses: 2
    Dernier message: 31/05/2007, 11h53
  3. Recuperer retour fonction PL/SQL
    Par pegase06 dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 14/02/2007, 09h25
  4. Retour fonction
    Par Heaven dans le forum C
    Réponses: 4
    Dernier message: 09/01/2004, 20h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo