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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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 : 35
    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 : 35
    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:
    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

+ 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