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 :

Encore une question sur les références


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut Encore une question sur les références
    Bonjour, je suis en train de me poser des questions sur les références en C++, en particulier les retours de références.

    J'ai une classe Base qui est assez lourde, dans cette classe j'ai une fonction du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Base & Base::extraireDebut(const int & nb) const {
        Base* base = new Base(); 
     
        ...
        ...
     
        return *base;
    }
    Cette fonction créer une nouvelle Base et la retourne par référence, en fait j'ai plusieurs questions:
    1. Est-ce que l'objet alloué dynamiquement sera détruit à la fin de cette fonction par exemple ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Base base;
     
    void f(int n) {
      Base base2 = base.extraireDebut(n);
    } // ici base2 est désallouée ou non ?
    2. Etant donné que la fonction extraireDebut() retourne un objet assez lourd je voudrait à tout pris éviter une recopie, selon vous le retour d'une référence est une bonne solution ou vaut-il mieux utiliser un pointeur (ce qui me dérange un peu car je souhaiterai que la personne qui utilise mon code n'ait pas à faire de delete) ? Ou peut-être existe t'il d'autres solutions ?

    3. Dernière question, j'utilise assez fréquemment les références comme paramètres des fonctions, à mon avis un peu trop souvent d'ailleurs, dans quels cas utiliser des références comme paramètre de fonctions ? Aussi, j'ai lu que les passage/retour par copie était parfois optimisés par les compilos et qu'il n'y avait en fait pas toujours de copie, avez vous plus d'infos à ce sujet ?

    Merci.

    Bouba

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    1. Non
    2. Si tu fais un new il faudra de toute façon un delete
    3. Passe par référence lorsque tu veux empêcher de pouvoir passer 0, évite de passer des types de base (int, float, etc..) par référence mais plutôt par copie, essaye de passer par const & quand c'est possible

    En gros voilà !
    Sinon pour les histoires d'optimisation, il faut toujours les faire à la fin en utilisant un 'profiler' car dans 90% des cas on optimise pour rien si on le fait prématurément...

    MAT.

  3. #3
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    Ok, merci.

  4. #4
    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
    Renvoyer un std::auto_ptr peut être une bonne idée, pour :

    - Signifier à l'appelant qu'il devra détruire le pointeur récupéré
    - Lui éviter de le faire explicitement, puisque std::auto_ptr le fera pour lui

  5. #5
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    Ouai, c'est génial ça, je ne suis pas un crack de C++ et donc je ne connaissais pas. Par contre j'ai lu que les auto_ptr n'était pas géniaux pour le passage en paramètre de fonctions (copie entraîne déallocation de l'objet pointé). En regardant un ptit coup dans Boost je me suis aperçu qu'il y avait beaucoup mieux, le shared_ptr. Ca a vraiment l'air pas mal, tu en penses quoi, tu connais ?

    Merci pour ta rep en tout cas.

    Bouba

  6. #6
    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
    std::auto_ptr, c'est globalement dangereux si on ne sait pas exactement ce qu'ils font. Par contre ils sont utiles dans deux cas :

    - Les fonctions "puits" : si une fonction prend en paramètre un std::auto_ptr ça signifie clairement qu'elle va désallouer la mémoire pointée

    - Les fonctions "sources" : si une fonction renvoie un std::auto_ptr, ça signifie que l'appelant va devoir libérer la mémoire renvoyée (ton cas ici).

    boost::shared_ptr est utile dans le cas où ton pointeur peut être partagé par plusieurs variables ; pas vraiment utile ici.
    Faut pas oublier qu'ici (enfin d'après ce que j'ai compris) on cherche juste à optimiser le renvoi d'une grosse variable pour éviter les copies inutiles ; on ne cherche pas vraiment à gérer intelligemment un pointeur brut.

  7. #7
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    Oui, je cherche à la fois à éviter la copie au niveau du retour de ma fonction, mais je souhaiterai aussi éviter le plus possible les erreurs des codeurs qui utiliserons mon code.
    En fait, je suis en train de réaliser une API, je trouvais donc l'utilisation des shared_ptr plutôt bien puisqu'ils n'obligent pas les utilisateurs à réaliser des delete et donc les empêches de faire n'importe quoi.
    Dans cet article l'auteur conclue carrément qu'il serait bien d'utiliser au maximum ce type de pointeurs: http://miles.developpez.com/tutoriel...oost/smartptrs

    Tu en pense quoi ? Peut-être qu'au niveau des perfs ça crain un peu ?, je ne sais pas trop, je vais me renseigner un peu mieux.

    Merci.

    Bouba

  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
    Oui il vaut mieux utiliser ce genre de pointeurs le plus possible (lorsque c'est justifié), et au niveau perf non ça ne craint pas le moins du monde

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

Discussions similaires

  1. encore une question sur les sockets
    Par hamidoo07 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 29/06/2009, 15h51
  2. Réponses: 2
    Dernier message: 07/03/2008, 10h29
  3. Encore une question sur les fichiers midi
    Par m14w dans le forum Delphi
    Réponses: 1
    Dernier message: 07/05/2007, 22h51
  4. Encore une question sur les Sous-Forums
    Par Swoög dans le forum Evolutions du club
    Réponses: 12
    Dernier message: 27/05/2006, 02h17
  5. Encore une question sur les ListBox !!
    Par SebRs dans le forum Windows
    Réponses: 3
    Dernier message: 09/05/2006, 15h29

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