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 :

question sur les pointeurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut question sur les pointeurs
    Bonjour.

    Je suis débutant en programmation / C++, et je me pose quelques questions...quand on envoi un pointeur d'objet à un autre objet, concrètement, ce qu'on envoi est:

    une simple adresse concernant le début de l'objet en question, donc quelque chose de très légers ?
    ou
    une série d'adresse comprenant toutes les fonctions, attributs etc...de l'objet, donc plus lourd?

    En somme, si j'ai un objet assez chargé en fonction et attributs, dont je n'ai besoin d'avoir accès qu'a quelques attributs/fonctions dans un autre objet, ais-je intérêt à'envoyer l'objet entier en pointeur, ou plutôt de me débrouiller autrement...?

    ex:

    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
     
    class ObjetLourd
    {
    public:
     
         ObjetLourd();
         ~ObjetLourd();
     
         ObjetX renvoiObjetX();
         ObjetY renvoiObjetY();
         etc...
         void faitUneChose(Truck truck, Bidul bidul, float machin);
         etc...
     
         bool renvoiSimple();
     
    private:
     
        ObjetX m_objetX, m_objetX2 etc...;
        ObjetY m_objetY, m_objetY2 etc...;
        etc...
        Truck m_truck1 etc...
        Bidul m_bdul1 etc...  
     
        float m_machin, m_machin2, etc...
     
        bool m_simple;
     
        etc...
     
    }
    a suposé, donc que "ObjetLourd" soit un objet qui contienne lui même plein d'objet, fonctions etc...et que j'ai simplement besoin d'utiliser la fonction bool "renvoiSimple()" par un autre objet


    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
     
     
    class AutreObjet
    {
     
    public:
     
         AutreObjet();
         ~AutreObjet();
     
        void recoitObjetLourd(ObjetLourd *objetLourd)
        {
        m_objetLourd = objetLourd;
        }
     
        void utiliseObjet()
       {
           if(m_objetLourd->renvoiSimple() == true)
           {
               //fait quelqueChose...
           }
       }
     
     
     
    private:
     
        ObjetLourd *m_objetLourd;
    }

    Si je procède ainsi, mon "AutreObjet" prendra-t-il des ressources en plus de facon concéquente ou pas? (même s'il n'utilise pas forcément de facon systématique le pointeur "ObjetLourd"...

    Bref, ce n'est pas encore tout à fait clair pour moi, les pointeurs, voila pourquoi je viens vers vous au cas ou vous pourriez m'aider à y voir plus clair...


    Merci

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 735
    Par défaut
    Bonjour.

    Dans ton exécutable, la règle est simple : « Tout est une question adresse » (les pointeurs, les fonctions, les variables etc…)

    Quant tu transmet un pointeur à quelqu'un d'autre, tu lui transmet uniquement une adresse, un emplacement en mémoire RAM.

    Maintenant comment le destinataire sait où se trouve le reste ? Où se cache faitUneChose(Truck, Bidul,float) en mémoire ?
    Comme je l'ai dit précédemment, tout est adresse, y compris les fonctions.

    Quand dans le code source on a objet.faitUneChose(t, b, f);, le compilateur inscrit l'adresse de la fonction « en dur » dans l’exécutable (ou plutôt un offset mais là on rentre dans le très bas niveau).

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    Merci pour votre réponse, Daïmanu.

    Si j'ai bien saisi, donc, quand j'envoi un pointer d'objet à un objet, en fait, je lui envoi toutes les adresses de chacune des fonctions de l'objet? donc plus l'objet envoyé est lourd, plus le pointeur envoyé le sera également, et donc l'objet qui le recevra aussi ?

  4. #4
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 735
    Par défaut
    Le pointeur c'est simplement une adresse mémoire, rien de plus. Sa taille ne varie pas selon ce vers quoi il pointe.

    Après c'est le compilateur qui gère tout ce qui est adresse, taille etc. On a pas a s'y préoccuper, c'est totalement transparent.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    OK.

    Donc, que j'envoi le pointeur d'un objet "mégaLourd", ou celui d'un "SuperLégers", il aura le même poid, prendra la même place (soit un simple nombre correspondant à une adresse).
    C'est simplement quand je l'utilise, qu'il va parcourir toutes les fonctions/attributs de l'objet concerné?

    Si j'ai bien compris, j'ai donc tout intérêt a envoyé des pointeurs d'objet, même lourd, pour une questions d'organisations du code, car cela ne ralentira pas plus le programme...?

  6. #6
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 735
    Par défaut
    Citation Envoyé par mazertys17 Voir le message
    Si j'ai bien compris, j'ai donc tout intérêt a envoyé des pointeurs d'objet, même lourd, pour une questions d'organisations du code, car cela ne ralentira pas plus le programme...?
    Quand tu dois transmettre un objet à une fonction, tu a deux choix : soit tu passe par valeur, soit par pointeur / référence
    Par valeur void f(ObjetLourd o); tu envoie une copie de ton objet à la fonction. Une copie d'autant plus longue à faire que ton objet est lourd.
    Par pointeur void f(ObjetLourd *o); tu envoie une copie de l'adresse de l'objet à la fonction, ce qui est bien plus léger. Les références f(ObjetLourd& o); sont un peu différents mais tout aussi rapide.

    Mais attention à ne pas tomber dans le piège « Mettre des pointeurs partout », il faut en mettre uniquement quand on doit transmettre un objet.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 307
    Par défaut
    Citation Envoyé par mazertys17 Voir le message
    OK.

    Donc, que j'envoi le pointeur d'un objet "mégaLourd", ou celui d'un "SuperLégers", il aura le même poid, prendra la même place (soit un simple nombre correspondant à une adresse).
    C'est simplement quand je l'utilise, qu'il va parcourir toutes les fonctions/attributs de l'objet concerné?

    Si j'ai bien compris, j'ai donc tout intérêt a envoyé des pointeurs d'objet, même lourd, pour une questions d'organisations du code, car cela ne ralentira pas plus le programme...?
    La taille des pointeurs c'est sizeof(void *) souvent 4 ou 8 octets. Quand tu as un objet lourd situé à l'adresse x alors si tu accedes à une variable membre m_ma_variable alors le compilateur sait que ce membre est situé à l'adresse x + offset où offset depend du membre bref c'est du temps constant. Si tu appelles une fonction virtuelle alors il y a simplement une indirection en plus mais c'est rapide.

    ps: utilise plutot des references "&" qui ne peuvent etre null pour passer tes objets "lourds"

Discussions similaires

  1. Question sur les pointeurs génériques
    Par mikedavem dans le forum C
    Réponses: 16
    Dernier message: 24/05/2006, 11h56
  2. question sur les pointeurs
    Par jd.baculard dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2006, 02h30
  3. [Debutant] Nouvelle question sur les pointeurs
    Par etiennegaloup dans le forum Débuter
    Réponses: 3
    Dernier message: 11/01/2006, 09h55
  4. Question sur les pointeurs.
    Par Chrisemi dans le forum C++
    Réponses: 5
    Dernier message: 28/10/2005, 23h47
  5. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25

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