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 :

predeclaration et pointeur de fonction membre


Sujet :

Langage C++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut predeclaration et pointeur de fonction membre
    Bonjour,
    dans un code je me retrouve avec une structure qui n'as pas la même taille suivant le .cpp.
    C'est lié à la prédéclaration et un pointeur de fonction membre sur cette class :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class maClass;
    struct A
    {
          void (maClass::* pFunc)();
    };
    Du coup si je met la déclaration de maClass avant la déclaration de A, sizeof(A) == 4;
    Du coup si je met la déclaration de maClass aprés la déclaration de A, sizeof(A) == 16;

    Je suppose que c'est l'interprétation du compilateur qui est différente :
    * si maClass est connue : c'est un pointeur sur une fonction membres
    * si maClass n’est pas encore connue : c'est un pointeur de fonction.

    et sous MSVC ces deux types de pointeur n'ont pas la même taille.

    Mais es ce bien cela??
    Voici un petit code de test. Il suffit de modifier la valeur du #if pour passer d'un cas à l'autre.

    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
    #include <iostream>
    class maClass;
     
    #if 0
        struct A
        {
              void (maClass::* pFunc)();
        };
     
     
    #else
        struct maClass
        {
            int a;
            int b;
     
        };
     
        struct A
        {
             void (maClass::* pFunc)();
     
        };
    #endif
     
     
     
     
    int main(int argc, char* argv[])
    {
     
        int sa = sizeof(A);
        std::cout << sa << std::endl;
    	return 0;
    }

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    En complément, si quelqu'un a une explication sur la différence de comportement entre gcc (mingw) et msvc. Avec gcc, sizeof vaut 8 dans les 2 cas, avec msvc, il vaut 8 ou 16. De plus, la version msvc peut faire planter le programme (voir le discussion sur ce problème sur le projet d'Amnell pour le défi Qt)

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    En complément, si quelqu'un a une explication sur la différence de comportement entre gcc (mingw) et msvc. Avec gcc, sizeof vaut 8 dans les 2 cas, avec msvc, il vaut 8 ou 16.
    Contrairement au C, l'ABI C++ n'est pas normalisé. Et c'est pour cela qu'un binaire C++ GCC n'est pas utilisable avec un binaire MSVC.



    Citation Envoyé par gbdivers Voir le message
    De plus, la version msvc peut faire planter le programme (voir le discussion sur ce problème sur le projet d'Amnell pour le défi Qt)
    Dans un endroit tu alloue un tableau où la taille de la structure vaut 24. Dans un autre endroit la taille vaut 8. Comme tu cherche à associer une instance de taille 24 dans une référence qui croit qu'elle vaut 8 =>y as un problème.

    C'est comme si tu faisait un reinterpret_cast sur un pointeur vers une structure totalement incompatible.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Citation Envoyé par yan Voir le message
    Mais es ce bien cela??
    Oui. C'est un détail d'implémentation de visual sur sa gestion des pointeurs de fonctions membres. En gros, c'est lié à des problématiques d'héritage et à ce que le compilateur connait au moment où il rencontre la définition du type de pointeur sur fonction membre.
    Cf ici et la réponse ici.

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,

    Oui. C'est un détail d'implémentation de visual sur sa gestion des pointeurs de fonctions membres. En gros, c'est lié à des problématiques d'héritage et à ce que le compilateur connait au moment où il rencontre la définition du type de pointeur sur fonction membre.
    Cf ici et la réponse ici.
    Je pensais que cela ne faisait pas partie du standard et dépendais de l'ABI.
    Donc c'est une violation du standard de msvc?


Discussions similaires

  1. Pointeur sur fonction membre avec parametre
    Par Glosialabolas dans le forum C++
    Réponses: 7
    Dernier message: 06/02/2006, 02h32
  2. Pointeur de fonction membre.
    Par fabone dans le forum C++
    Réponses: 2
    Dernier message: 18/01/2006, 13h18
  3. Pointeur de fonction membre
    Par legend666 dans le forum C++
    Réponses: 1
    Dernier message: 04/10/2005, 20h46
  4. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  5. Réponses: 5
    Dernier message: 12/01/2005, 20h58

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