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 :

EBCO et méthodes abstraites


Sujet :

C++

  1. #1
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut EBCO et méthodes abstraites
    Bonjour à tous,

    je viens poster pour obtenir un renseignement à propos de l'EBCO ( Empty Base Class Optimization ).
    Je développe actuellement un projet, j'utilise l'idiome CRTP afin de créer un polymorphisme sans le coup du polymorphisme ( pas de vtbl ). Par contre en utilisant ce principe, je ne peut pas forcer le codeur ( moi ) à implémenter des méthodes car je ne veux pas de vtbl.

    Ma question est simple, je sais que une fonction virtuel = une entrée dans la vtbl et pas de EBCO possible. Mais avec une méthode abstraite, est-ce que cette optimisation est réalisée? Je n'appelle jamais la méthode abstraite mais directement la méthode spécialisée. Sachant que cela dépend fortement du compilateur qui sont frileux sur cette optimisation, je suis sur Visual Studio 2010 : optimisation /Ox

    merci beaucoup

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Après un petit test rapide ( j'avais la flemme ), une méthode abstraite rajoute 4 bytes à un classe, ce qui veux dire que l'EBCO n'est pas possible... Dommage...
    Existe-t-il un moyen de forcer l'utilisateur à définir une méthode sans passer par les méthodes virtuelles? un test statique ou autres solutions ?

    Merci

  3. #3
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    En les utilisant sur une instance de fille dans une fonction membre "check_required_function" de la mère ?

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    template<class Fille>
    struct Mere
    {
      void foo() { static_cast<Fille*>(this)->int_foo(); }
      void int_foo() {} //facultatif, simule une fonction abstraite si omise
    };
     
    struct Fille1 : Mere<Fille1>
    { void int_foo() {std::cout << 1;} };
    cf wikipédia CRTP, et surment des articles sur Dr Dobb's

    Si l'utilisateur ne définit pas int_foo dans les classes filles (dans le cas où int_foo est omise dans Mere) alors il y aura une erreur à l'appel de foo.

    NB: Tu peus simuler une partie du polymorphisme avec le CRTP, mais en aucun cas totalement.

  5. #5
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    wikipédia CRTP, et surment des articles sur Dr Dobb's
    Ce n'est pas comment faire le CRTP ma question.

    Si l'utilisateur ne définit pas int_foo dans les classes filles (dans le cas où int_foo est omise dans Mere) alors il y aura une erreur à l'appel de foo.
    Ceci ne permet pas l'optimisation EBCO de la classe mère! Elle vaudrais au minimum 4bytes.

    En les utilisant sur une instance de fille dans une fonction membre "check_required_function" de la mère ?
    je vais me pencher la dessus, mais j'aurais aimé, un test statique, qui ne grossi pas la classe à la compilation et ne prennent aucun temps supplémentaire à l'exécution. Un genre de static_assert qui lance une erreur si la fonction n'est pas trouvé dans la classe à la compilation.

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    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
     
    template<class Fille>
    struct Mere
    {
      void foo() { static_cast<Fille*>(this)->int_foo(); }
    };
     
    struct Fille1 : Mere<Fille1>
    { void int_foo() {std::cout << 1;} int i; };
     
    int main()
    {
      std::cout << sizeof(Mere<Fille1>) << sizeof(Fille1);
      system("PAUSE"); return 0; 
    }
    Sortie 1 4, donc EBCO activé et foo se comporte comme une fonction abstraite. Si je me trompe pas c'est bien ta question.

  7. #7
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Ce que j'ai réalisé est une variante, j'ai du mal m'exprimer. Quand je dis j'utilise le CRTP, je veux dire je me suis inspiré du CRTP.
    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
     
    class A
    {
        void CreateWindow()
        {
            std::cout << "Fabrication Platform Win32" << std::endl;
        }
    };
    template< class T>
    class B : public T
    {
    public:
        void Create()
        {
            CreateWindow();
        }
    };
    l'utilisateur l'utilise comme suis, dans mon projet c'est plus complexe mais je simplifie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    B<A> platfromwin32;
    L'utilisateur peut créer des classes A comme il le désire, pour OsX, Linux...
    J'aimerais qu'il soit obligé d'hériter sa classe d'une emptybase(pour premettre la EBCO), qui réalise des vérifications statique sur l'enfant obligeant l'utilisateur à les intégrer dans sa classe. Je ne veux pas que l'erreur de compilation apparaissent dans la classe B et me dise "CreateWindow(); n'est pas défini". Je voudrais que la compilation stop à la vérification de l'emptybase classe et informe par des messages prédéfinis plus explicite pour le programmeur.

    Par contre, je me demande comment réaliser des tests statique dans une classe ne devant pas dépasser 0bytes en mémoire.... Je ne sais pas si c'est possible

  8. #8
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    En faite , ma question est plus une étude de faisabilité

  9. #9
    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,
    Il y a peut être des idées à prendre sur Boost.Concept Check

  10. #10
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Il y a peut être des idées à prendre sur Boost.Concept Check
    Merci beaucoup, je vais jeter un œil à ça. Apparement , ça pourrais résoudre mon problème effectivement:
    The Boost Concept Checking Library provides:

    • A mechanism for inserting compile-time checks on template parameters at their point of use.
    • A framework for specifying concept requirements though concept checking classes.
    • A mechanism for verifying that concept requirements cover the template.
    merci

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

Discussions similaires

  1. [SAX] Erreur méthode abstraite
    Par kij dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 13/12/2006, 11h55
  2. Réponses: 14
    Dernier message: 17/11/2006, 19h17
  3. Méthodes abstraites et statiques
    Par Asnidren dans le forum Langage
    Réponses: 24
    Dernier message: 01/09/2006, 14h15
  4. Question sur les méthodes abstraites
    Par nmathon dans le forum Delphi
    Réponses: 3
    Dernier message: 15/06/2006, 20h30
  5. Les méthodes abstraites et les interfaces
    Par ETI-trian dans le forum Langage
    Réponses: 3
    Dernier message: 17/01/2006, 12h14

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