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

Qt Discussion :

Conteneurs -> mettre objets ou pointeurs?


Sujet :

Qt

  1. #1
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut Conteneurs -> mettre objets ou pointeurs?
    Bonjour, quand on stocke des objets dans des conteneurs quelconques tels que QList, est-ce que ça apporte quoi que ce soit des mettre des pointeurs à la place d'objets?

    J'ai vu (dans la doc il me semble) que les conteneurs font très bien leur travail stockent eux même des pointeurs sur les objets stockés. Donc inutile de stocker des pointeurs au lieu d'objets.

    Je voudrais juste avoir confirmation.

    Autre question: le destructeur du conteneur appelle le destructeur de l'objet stocké?

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 1 655
    Points : 2 152
    Points
    2 152
    Par défaut
    salut,

    la grosse différence entre stocker les objets et stocker leurs pointeurs est que lorsque tu stockes des objets, c'est une copie de l'objet qui est faite.

    Partant de là, tout dépend de tes besoins, mais il vaut mieux limiter les copies d'objets au maximum lorsque ceux-ci sont 'imposants' et que ce n'est pas indispensable.
    Par exemple, faire une QList sur des instances d'objets contenant un buffer de plusieurs dizaine de ko risque de rapidement alourdir le programme ; à contrario, faire une QList de pointeurs sur des 'int' n'a quasiment aucun sens.

    Concernant le partage de ressources, il existe effectivement des classes qui sont malignes et qui peuvent partager le même espace mémoire quand elles contiennent exactement les même données. Elles sont alors capables de se détacher l'une de l'autre (et donc d'avoir chacune leur copie des données) quand c'est nécessaire, c'est à dire quand un accès en écriture est fait dans l'un des objets qui pointe vers l'espace de données commun.

    On appelle ça le 'copy on write', et différentes classes du framework Qt le gèrent automatiquement (entres autres QByteArray et QString, si ma mémoire est bonne). Pour savoir quelles classes le gèrent et quelles autres ne le gèrent pas, il faut aller voir au cas par cas dans la doc Qt.

    En espérant avoir répondu à ta question...

    EDIT: le 'copy on write' est aussi appelé 'implicit sharing' dans la doc de Qt et le lien ci-avant te donnera la liste des classes qui le supportent (à savoir ... une bonne patatée dans Qt4 )
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  3. #3
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Merci d'avoir pris le temps de me répondre aussi clairement. Malheureusement je connais bien ce que tu as expliqué, j'ai du mal poser la question.

    En fait, je voulais savoir si en interne, les conteneurs de Qt stokaient les objets de type T (ex si on a crée une liste QList<T>) ou seulement des pointeurs T* de ces objets, ce qui parraît plus logique.

    En fait en relisant mieux la doc la réponse:

    Internally, QList<T> is represented as an array of pointers to items. (Exceptionally, if T is itself a pointer type or a basic type that is no larger than a pointer, or if T is one of Qt's shared classes, then QList<T> stores the items directly in the pointer array.)
    Donc inutile de lui filer des pointeurs, autant lui donner des objets dont il prendra seulement les pointeurs.
    En plus ça répond à une autre question que je me posais: si on lui file des pointeurs il stocke directement les pointeurs. Et si on lui donne des objet "shared" il stocke aussi les pointeurs.

    Par contre faut que je fasse gaffe au cas où je lui donne un objet dont la porté est limitée et dont il garde un pointeur.

    Ma 2ème question: Le destructeur du conteneur appelle le destructeur de l'objet stocké?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    mars 2004
    Messages
    10 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2004
    Messages : 10 031
    Points : 13 948
    Points
    13 948
    Par défaut
    Euh... je ne comprend pas trop ta question, mais si tu as un QList<T>,
    Ta liste utilisera bien des pointeur, c'est son fonctionnement interne.
    Mais quand tu fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int i =1;
    QList<int> l;
    l.append(i);
    append ajout la valeur i en créant une copie.

  5. #5
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Oui c'est bien ça merci, et pour ma 2ème question?

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    mars 2004
    Messages
    10 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2004
    Messages : 10 031
    Points : 13 948
    Points
    13 948
    Par défaut
    Citation Envoyé par Nykoo Voir le message
    Oui c'est bien ça merci, et pour ma 2ème question?
    Ce que je voulais dire, que tu utilise des pointeur ou non, ca ne change que la gestion en interne de ta QList.
    Je ne comprend pas ta question..
    Peut tu faire un morceau de code pour aider à expliquer ta question???

  7. #7
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Ah non je parle de la 2ème question pas de mon 2ème post

    2ème question: le destructeur de QList appelle-t-il le destructeur des objets stockés?

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    mars 2004
    Messages
    10 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2004
    Messages : 10 031
    Points : 13 948
    Points
    13 948
    Par défaut
    Citation Envoyé par Nykoo Voir le message
    Ah non je parle de la 2ème question pas de mon 2ème post

    2ème question: le destructeur de QList appelle-t-il le destructeur des objets stockés?
    Si ce n'est pas un pointeur oui

  9. #9
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 1 655
    Points : 2 152
    Points
    2 152
    Par défaut
    Citation Envoyé par Nykoo Voir le message
    Oui c'est bien ça merci, et pour ma 2ème question?
    Non, te remarque suivante montre qu'on ne s'est pas bien compris.

    Par contre faut que je fasse gaffe au cas où je lui donne un objet dont la porté est limitée et dont il garde un pointeur.
    On n'est pas d'accord sur ce point : ok, dans la tambouille interne des conteneurs, c'est stocké sous forme de pointeurs.

    Mais la tambouille interne reste la tambouille interne. Ce qui t'intéresse, toi c'est le comportement du point de vue 'utilisateur de la classe'. Et là, c'est l'utilisation suivante:

    Lorsque tu as une liste d'objets à laquelle tu ajoutes un objet, une copie de l'objet que tu as passé en paramètre est faite. En d'autres termes, en interne, bien que le stockage se fasse par pointeurs, la liste ne stocke pas le pointeur de l'objet que tu lui as passé en paramètre, mais sa copie.

    Ainsi, ceci est valable:
    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
     
    QList<int> list;
     
    void foo() {
        int i =123;
        list.append(i);
        // une copie en interne de i a été faite (appelons la 'z').
        // list en interne stocke le pointeur vers 'z'
    }
    // fin de fonction, la variable i est détruite.
     
    void main(int argc, char** argv) {
        foo();
        int j = list.get(0); // retourne une copie de 'z'
    }
    // fin de programme.
    // list est détruite et 'z' est détruit avec.
    En d'autres termes, j vaudra bien 123, alors même que i a déjà été détruite depuis que le programme est sorti de la fonction 'foo', ce qui prouve qu'une copie de i a été faite lors de ton 'append' à la liste.

    Pour la deuxième question, on a bien les deux cas:

    - QList<FooObject> appelle bien le destructeur de chaque objet.
    - QList<FooObject*> n'appelle pas le destructeur de ce vers quoi pointe FooObject*, il ne détruit que le pointeur.

    C'est logique : pour un type de template donné T, on a:

    - si T = MonObjet, un delete &T (donc delete Monobjet*) sera fait dans le QList::remove, donc l'instance de T sera supprimée.

    - si T = MonObjet*, un delete &T (donc delete Monobjet**) sera fait dans le QList::remove, donc l'instance du pointeur de MonObjet sera supprimée, pas l'instance de T.

    Pour t'embrouiller encore un peu plus (), il existait une fonction dans Qt3 qui faisait ce que tu voulais, à savoir supprimer l'instance correspondant à un pointeur, dans le cas d'une collection de pointeurs : setautoDelete(). Mais elle n'existe plus avec Qt4.x, probablement car les conteneurs d'objets et les conteneurs de pointeurs d'objets ont été fusionnés en une seule classe avec le passage de Qt 3.x à Qt 4.x.

    En espérant avoir été plus clair (ou pas )
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  10. #10
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Ok un grand merci à vous deux

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

Discussions similaires

  1. Objet et Pointeur
    Par Just-Soft dans le forum Langage
    Réponses: 19
    Dernier message: 17/01/2009, 11h55
  2. Manipulation d'objet / de pointeurs
    Par gnulix dans le forum C++
    Réponses: 4
    Dernier message: 15/04/2007, 14h59
  3. Réponses: 8
    Dernier message: 08/11/2006, 19h41
  4. conserver ma liste d'objets sans Pointeur Null ...
    Par comme de bien entendu dans le forum Général Java
    Réponses: 8
    Dernier message: 24/03/2006, 12h55
  5. Construction objets et pointeurs
    Par Jahjouh dans le forum C++
    Réponses: 2
    Dernier message: 12/01/2006, 11h10

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