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

Langage C++ Discussion :

[Langage] Taille des pointeurs


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut [Langage] Taille des pointeurs
    Citation Envoyé par Alp Voir le message
    dans ce lien, il écrit à un moment la classe de trait:
    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
     
    template <typename T>
    struct CallTraits
    {
        template <typename U, bool Big> struct CallTraitsImpl;
     
        template <typename U>
        struct CallTraitsImpl<U, true>
        {
            typedef const U& Type;
        };
     
        template <typename U>
        struct CallTraitsImpl<U, false>
        {
            typedef U Type;
        };
     
        typedef typename CallTraitsImpl<T, (sizeof(T) > 8)>::Type ParamType;
    };
    une référence prend elle vraiment 8 octets ? (les pointeurs ne sont-ils pas des int ?)
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    une référence prend elle vraiment 8 octets ? (les pointeurs ne sont-ils pas des int ?)
    Déjà, la taille devrait être écrite par rapport à un sizeof et non un nombre magique, mais ce cas est pour les problèmes de pointeur de membre: Un pointeur de membre peut être plus grand qu'un pointeur simple, notamment dans le cas de l'héritage multiple.
    Voir cette page et les autres pages qu'elle référence.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Déjà, la taille devrait être écrite par rapport à un sizeof et non un nombre magique, mais ce cas est pour les problèmes de pointeur de membre: Un pointeur de membre peut être plus grand qu'un pointeur simple, notamment dans le cas de l'héritage multiple.
    Voir cette page et les autres pages qu'elle référence.
    j'avoue ne pas tout comprendre: qu'est-ce qu'un "adjustor" (une référence)? les références n'ont ellles pas de taille fixe ?
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Eh bien, pas pour les "pointeurs de membres" (tu sais, les pointeurs avec une syntaxe bizarre), à cause de l'héritage multiple.
    Je ne saurais pas expliquer plus en détail que dans cet article référencé par l'autre, par contre...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Eh bien, pas pour les "pointeurs de membres" (tu sais, les pointeurs avec une syntaxe bizarre), à cause de l'héritage multiple.
    Je ne saurais pas expliquer plus en détail que dans cet article référencé par l'autre, par contre...
    Je crains que ce ne soit l'article qui soit en cause, mais mon piètre niveau d'anglais (et de C++) en efft, je ne comprend pas pourquoi un pointeur à un membre serait plus gros qu'un pointeur externe par exemple. sinon, la taille "normale" d'un pointeur est bien 4octets non ?
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    Je crains que ce ne soit l'article qui soit en cause, mais mon piètre niveau d'anglais (et de C++) en efft, je ne comprend pas pourquoi un pointeur à un membre serait plus gros qu'un pointeur externe par exemple.
    Je vais essayer de traduire.
    En gros, tant qu'il n'y a pas d'héritage multiple, le pointeur n'est qu'un pointeur normal, aucun problème.
    En effet, toutes les fonctions membres de la hiérarchie de classes utilisent le même pointeur this, aucun ajustement n'est nécessaire.

    Maintenant, avec une classe qui dérive de deux autres:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Base1 { int b1; void Base1Method(void); };
    class Base2 { int b2; void Base2Method(void); };
    class Derived : public Base1, Base2
      { int d; void DerivedMethod(void); };
    Ici, ça se complique, car le pointeur this passé aux méthodes de Base1 n'est pas le même que le pointeur this passé aux méthodes de Base2 : En gros:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Derived deriv;
    Base1 * pb1 = &deriv;
    Base2 * pb2 = &deriv;
    //Ici, pb1 et pb2 n'auront pas la même valeur.
    C'est la présence de différents this qui fait qu'un pointeur simple ne suffit plus.
    Si tu déclares un pointeur de ce type:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void (Derived::*ptrFonc)(void);
    switch(unTruc)
    {
    case 1: ptrFonc = &Derived::Base1Method; break;
    case 2: ptrFonc = &Derived::Base2Method; break;
    case 3: ptrFonc = &Derived::DerivedMethod; break;
    }
    (deriv.*ptrFonc)();
    Comme on ne peut pas passer le même this à Base1Method et Base2Method, on est obligé de noter quelque part le décalage. Et on le note dans le pointeur de fonction membre, c'est pourquoi il prend huit octets au lieu de quatre.

    sinon, la taille "normale" d'un pointeur est bien 4octets non ?
    Sur un système 32 bits, oui.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    Je crains que ce ne soit l'article qui soit en cause, mais mon piètre niveau d'anglais (et de C++) en efft, je ne comprend pas pourquoi un pointeur à un membre serait plus gros qu'un pointeur externe par exemple. sinon, la taille "normale" d'un pointeur est bien 4octets non ?
    Ce petit programme montre une partie des varietes de comportements d'un pointeur vers fonction membre. Si un simple pointeur devrait suffire dans les cas simple, ca ne va certainement pas deja si on lui assigne une fonction virtuelle et il faut encore plus d'info pour traiter les cas d'heritages multiples, virtuel ou non.

    On pourrait vraisemblablement s'en sortir en generant des stubs -- qui ralentiraient les appels a travers les pfm.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include <iostream>
     
    struct c1 {
        void f() { std::cout << "c1::f()\n"; }
        virtual void g() { std::cout << "c1::g()\n"; }
    };
     
    struct c2: c1 {
        void f() { std::cout << "c2::f()\n"; }
        virtual void g() { std::cout << "c2::g()\n"; }
    };
     
    struct c3: virtual c1 {
        void f() { std::cout << "c3::f()\n"; }
        virtual void g() { std::cout << "c3::g()\n"; }
    };
     
    struct c4: virtual c1 {
        void f() { std::cout << "c4::f()\n"; }
    };
     
    struct c5: c3, c4 {
        void f() { std::cout << "c5::f()\n"; }
    };
     
    struct c6: c3, c4 {
        void f() { std::cout << "c6::f()\n"; }
        virtual void g() { std::cout << "c6::g()\n"; }
    };
     
    int main()
    {
        c1 o1;
        c2 o2;
        c3 o3;
        c4 o4;
        c5 o5;
        c6 o6;
     
        c1& o2b = o2;
        c1& o3b = o3;
        c1& o4b = o4;
        c1& o5b = o5;
        c1& o6b = o6;
        c4& o54 = o5;
        c4& o64 = o6;
     
        void (c1::* fn)() = &c1::f;
     
        std::cout << "c1  "; (o1.*fn)();
        std::cout << "c2  "; (o2.*fn)();
        std::cout << "c3  "; (o3.*fn)();
        std::cout << "c4  "; (o4.*fn)();
        std::cout << "c5  "; (o5.*fn)();
        std::cout << "c6  "; (o6.*fn)();
        std::cout << "(c1&)c2  "; (o2b.*fn)();
        std::cout << "(c1&)c3  "; (o3b.*fn)();
        std::cout << "(c1&)c4  "; (o4b.*fn)();
        std::cout << "(c1&)c5  "; (o5b.*fn)();
        std::cout << "(c1&)c6  "; (o6b.*fn)();
        std::cout << "(c4&)c5  "; (o54.*fn)();
        std::cout << "(c4&)c6  "; (o64.*fn)();
     
        fn = &c1::g;
     
        std::cout << "c1  "; (o1.*fn)();
        std::cout << "c2  "; (o2.*fn)();
        std::cout << "c3  "; (o3.*fn)();
        std::cout << "c4  "; (o4.*fn)();
        std::cout << "c5  "; (o5.*fn)();
        std::cout << "c6  "; (o6.*fn)();
        std::cout << "(c1&)c2  "; (o2b.*fn)();
        std::cout << "(c1&)c3  "; (o3b.*fn)();
        std::cout << "(c1&)c4  "; (o4b.*fn)();
        std::cout << "(c1&)c5  "; (o5b.*fn)();
        std::cout << "(c1&)c6  "; (o6b.*fn)();
        std::cout << "(c4&)c5  "; (o54.*fn)();
        std::cout << "(c4&)c6  "; (o64.*fn)();
     
        return 0;
    }
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ces problèmes pour les pointeurs de fonctions membres interdisent tout transtypage qui ne tient pas dans un static_cast. Si un transtypage est accepté par un static_cast, il n'y a pas de problème.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Taille des pointeurs
    Par Bktero dans le forum Débuter
    Réponses: 12
    Dernier message: 23/04/2010, 16h31
  2. taille des pointeurs et des entiers
    Par luckyvae dans le forum C++
    Réponses: 15
    Dernier message: 09/03/2010, 10h18
  3. Langage C : Utilisation des pointeurs
    Par Minimaster dans le forum Débuter
    Réponses: 1
    Dernier message: 30/11/2008, 23h08
  4. Taille des pointeurs
    Par j0o0 dans le forum C
    Réponses: 12
    Dernier message: 08/09/2007, 13h00
  5. [info] taille des adresses des pointeurs Java
    Par TabrisLeFol dans le forum Général Java
    Réponses: 11
    Dernier message: 14/02/2006, 13h24

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