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 :

générique vs virtual


Sujet :

C++

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut générique vs virtual
    Quels sont les arguments pour choisir entre un design classique héritage virtuel etc et une implémentation à l'aide de templates ?

    j'ai l'impression qu'à chaque fois les deux sont possibles, mais je ne sais pas quel critère retenir pour arbitrer....

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ce que tu demandes est un non sens puisque template et héritage sont orthogonaux. Ils n'entrent pas en concurrence, ils se complètent.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    hum je vois. Mais dans le cas du CRTP on a bien à faire à quelquechose de non orthogonal non ?

  4. #4
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Dans le cas du CRTP, on simule du polymorphisme d'inclusion (virtual) avec des templates, mais les deux ne sont pas mélangés. Mais dans ce cas tu ne pourras pas stocker par exemple pleins d'éléments de cette hiérarchie dans un même conteneur, car la classe mère est template et donc Mere<int> est incompatible avec Mere<std::string> par exemple.

    Je te conseille de lire cette page : http://cpp.developpez.com/faq/cpp/?p..._polymorphisme depuis l'ancre que j'ai donnée jusque tout en bas.

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    ok merci

  6. #6
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonsoir,

    personnellement, je privilégie toujours les templates par rapport à l'héritage, quand c'est possible, de manière à conserver de bonnes performances. Je fais notamment tout pour éviter d'avoir à utiliser la vitualité pure.

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Bonsoir,

    personnellement, je privilégie toujours les templates par rapport à l'héritage, quand c'est possible, de manière à conserver de bonnes performances. Je fais notamment tout pour éviter d'avoir à utiliser la vitualité pure.
    au niveau performance tu vois une différence entre pure et juste virtual ?

  8. #8
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Oui, et elle varie énormément en fonction du compilateur.

  9. #9
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Oui, et elle varie énormément en fonction du compilateur.
    techniquement ça vient de quoi ? je pensais que c'était juste une vtable à gérer dans les deux cas et qu'il n'y avait pas de différence ...

  10. #10
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,

    Citation Envoyé par Aleph69 Voir le message
    Oui, et elle varie énormément en fonction du compilateur.
    je veux bien que tu complètes un peu. Car entre virtuel et virtuel pure, on a dans les 2 cas la même vtable. La différence peut exister en cas d'héritage virtuel où à côté de la vtable il y a l'offset à gérer. Mais entre virtuel et virtuel pure

  11. #11
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonsoir,

    je ne suis pas suffisamment calé en C++ pour amener des arguments théoriques ou techniques : il s'agit de tests très simples que j'ai fait avec gcc et le compilateur de Visual. Ces tests avaient d'ailleurs donné lieu à une discussion dans ce même forum. Ceci dit, je tiens à préciser que dans tous mes messages je fais bien référence à l'héritage conformément à la question initiale de guillaume07. Pour être concret, lorsqu'on fait une classe abstraite dont héritent plusieurs classes, on peut perdre énormément en performances sur des méthodes même très élémentaires. Je n'en connais malheureusement pas la raison.

  12. #12
    screetch
    Invité(e)
    Par défaut
    je veux bien voir ca aussi. a priori c'est pas possible...

  13. #13
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Je suis également très sceptique.
    Find me on github

  14. #14
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par Aleph69 Voir le message
    Pour être concret, lorsqu'on fait une classe abstraite dont héritent plusieurs classes, on peut perdre énormément en performances sur des méthodes même très élémentaires.
    On parle bien de comparer :
    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
    struct A
    {
        virtual void fonction(){}
    };
     
    struct B : public A
    {
        virtual void fonction(){}
    };
     
    int main()
    {
        B b;
        A &ra = b;
        ra.fonction();
        return 0;
    }
    Avec :
    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
    struct A
    {
        virtual void fonction()=0;
    };
     
    struct B : public A
    {
        virtual void fonction(){}
    };
     
    int main()
    {
        B b;
        A &ra = b;
        ra.fonction();
        return 0;
    }
    Et non pas avec :
    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
    struct A
    {
        void fonction(){}
    };
     
    struct B : public A
    {
        void fonction(){}
    };
     
    int main()
    {
        B b;
        A &ra = b;
        ra.fonction();
        return 0;
    }

  15. #15
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    j'ai retrouvé la discussion : ça sera plus simple que des longs discours.
    http://www.developpez.net/forums/d96...-performances/
    Si ma mémoire est bonne, le problème se pose lorsqu'on déclare le destructeur.

  16. #16
    screetch
    Invité(e)
    Par défaut
    salut,
    je ne vois pas un seul virtuel dans ton code! c'est moi ou bien...

  17. #17
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par screetch Voir le message
    salut,
    je ne vois pas un seul virtuel dans ton code! c'est moi ou bien...
    J'ai survolé le lien et je me demande si ce n'est pas simplement le fait du destructeur : dans un cas c'est le destructeur implicite probablement squizzé par le compilo et dans l'autre c'est un destructeur explicite virtuel probablement pas éliminé par gcc en mode release. Faudrait remonter une manip.

Discussions similaires

  1. [tomcat]comment cree un "Virtual Host" avec tomcat
    Par nouaman dans le forum Tomcat et TomEE
    Réponses: 17
    Dernier message: 04/06/2004, 22h51
  2. caractère générique utilisable dans strcmp
    Par barthelv dans le forum C
    Réponses: 9
    Dernier message: 01/08/2003, 16h54
  3. Déclenchement Programme sur Virtual Key
    Par Tom-G dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 09/05/2003, 12h58
  4. Virtual-key code
    Par lyrau dans le forum Windows
    Réponses: 2
    Dernier message: 29/03/2003, 19h22
  5. Abstract VS virtual
    Par LE CHAKAL dans le forum Langage
    Réponses: 2
    Dernier message: 29/08/2002, 17h50

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