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 :

Instanciation, constructeur inline, vtable


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut Instanciation, constructeur inline, vtable
    Bonjour,

    y a-t-il perte de perfs (mémoire ou vitesse) entre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct Test
    {
      Test()
      {
      }
    };
     
    int main()
    {
      Test t;
    }
    et:

    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
     
    struct Base
    {
      Base()
      {
      }
     
      virtual void func() =0;
    };
     
    struct Test : public Base
    {
      Test()
      {
      }
     
      virtual void func()
      {
      }
    };
     
    int main()
    {
      Test t;
    }
    ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ben, la seconde structure Test possède une taille non-nulle (typiquement la taille d'un pointeur, celui vers la vtable), mais de là dire que ce n'est pas négligeable...
    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 expérimenté Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Par défaut
    Dans cet exemple précis, non, puisque le compilateur vire tout ce qui n'est pas utilisé (normalement).

    Dans un programme plus compliqué où les fonctions virtuelles sont effectivement utilisées, sache qu'elles prennent de la mémoire et du proc, oui.

    A toi de faire les tests pour savoir si c'est utile, et si tu peux te permettre la perte de perf (ce qui est assez probable sauf sans des bouts de code critique).

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    y a-t-il perte de perfs (mémoire ou vitesse)
    Comme toujours,
    - mesurer est la seule approche raisonnable si ca a de l'importance.
    - comparer deux codes qui ne font pas la meme chose pose des problemes d'interpretation des resultats.

    entre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct Test
    {
      Test()
      {
      }
    };
     
    int main()
    {
      Test t;
    }
    et:

    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
     
    struct Base
    {
      Base()
      {
      }
     
      virtual void func() =0;
    };
     
    struct Test : public Base
    {
      Test()
      {
      }
     
      virtual void func()
      {
      }
    };
     
    int main()
    {
      Test t;
    }
    Dans le premier cas, Test peut etre vide. Dans le second il doit contenir assez d'info pour resoudre les fonctions virtuelles (generalement un pointeur vers une table decrivant le type et ses fonctions virtuelles). Donc peu de chance qu'il puisse etre vide (bien que... un optimiseur global pourrait remarquer que ce n'est pas utilise) et il faut initialiser les donnees.

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Cela n'a pas vraiment d'importance dans mon appli, il n'y a pas de répercurtions sensibles en terme de vitesse. Mais je ne sens pas la différence parce que parallelement à ces créations je fais des inputs // outputs de fichiers texte bien plus couteux. Je ferai chez moi une boucle avec ce simple test unitaire.

    J'aimerais bien lire des choses sur ce sujet. Vous avez de la doc ou un bouquin à me conseiller qui traiterait de ça (mis à part la norme) ?

    Jean Marc, lorsque tu dis que mes deux codes ne font pas la même chose, tu fais référence à l'initialisation de la vtable par le constructeur pour le second code ?

    Si oui, c'était justement ce que je voulais savoir, si il y avait des initialisations supplémentaires engendrées par l'héritage.

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    J'aimerais bien lire des choses sur ce sujet. Vous avez de la doc ou un bouquin à me conseiller qui traiterait de ça (mis à part la norme) ?
    Le Technical Report on C++ performance ? (-> "TR18015 filetype:pdf")

    Sinon, Matthew Wilson parle des Empty Base Class Optimization dans son Imperfect C++. Le bouquin n'est pas inintéressant, mais juste pour cela inutile de l'acheter. Fais tes propres mesures.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Cela n'a pas vraiment d'importance dans mon appli, il n'y a pas de répercurtions sensibles en terme de vitesse.
    Quelle importance alors? Le seul contexte ou la performance a de l'importance, c'est l'appli.

    Mais je ne sens pas la différence parce que parallelement à ces créations je fais des inputs // outputs de fichiers texte bien plus couteux. Je ferai chez moi une boucle avec ce simple test unitaire.

    J'aimerais bien lire des choses sur ce sujet. Vous avez de la doc ou un bouquin à me conseiller qui traiterait de ça (mis à part la norme) ?
    Si j'ai bien compris.

    http://www.amazon.fr/Inside-Object-M...9279041&sr=1-1

    http://ldeniau.web.cern.ch/ldeniau/o...ml#CPPObjModel

    Jean Marc, lorsque tu dis que mes deux codes ne font pas la même chose, tu fais référence à l'initialisation de la vtable par le constructeur pour le second code ?
    Pas tellement la vtable -- a priori son initialisation est statique -- mais le pointeur vers la vtable.

    Et naturellement, dans un cas il y a une fonction virtuelle, dans l'autre pas. Un vrai programme utiliserais vraisemblablement la fonction virtuelle pour quelque chose, donc il faut compliquer d'autant l'alternative.

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Merci pour ces références

    Quelle importance alors? Le seul contexte ou la performance a de l'importance, c'est l'appli.
    Evidemment, mais le but de ma question était d'apercevoir le mécanisme sousjacent, d'apprendre des choses sur le sujet qui reste encore flou pour moi.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/04/2007, 14h51
  2. Instanciation dans une fonction inline
    Par mister3957 dans le forum C++
    Réponses: 5
    Dernier message: 04/03/2007, 19h27
  3. Instancier objet dont constructeur ni private ni public
    Par babarpapa dans le forum Langage
    Réponses: 14
    Dernier message: 21/06/2006, 13h17
  4. Réponses: 3
    Dernier message: 02/05/2006, 15h12
  5. Optimisation -> inline et constructeurs
    Par oldfox dans le forum C++
    Réponses: 15
    Dernier message: 27/01/2006, 16h23

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