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 :

Comment downcaster rapidement


Sujet :

C++

  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut Comment downcaster rapidement
    EDIT : je précise que j'utilise VS2005 Express

    Bonjour,

    J'ai une architecture avec pas mal de classes.

    En gros, une classe mère et plusieurs classes filles.

    Je sais que le downcasting, c'est mal !

    Mais bon, là j'ai fouillé dans tous les sens :
    - essayé avec des templates : ça devient beaucoup trop lourdingue comme code
    - essayé avec des fonctions dont le type de retour est covariant, mais ça ne resoud pas tous mes problèmes.

    En fait, je voudrais surtout savoir quel type de cast utiliser sachant que :
    - je sais que le cast est possible (je cast un pointeur du type de la classe mère qui pointe vers un objet de la classe fille vers un pointeur de CETTE classe fille)
    - les performances sont importantes

    Si j'ai tout bien compris, dans mon cas, je peux utiliser un static_cast

    Mais que se passe-t-il au niveau du compilateur ?

    Il y a une quelconque verification ?

    En fait je voudrais eviter toute verification, vu que je sais que la conversion est possible, que mon objet existe, etc....



    Pour donner une idée, c'est ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Mere
    {
       .....
    }
    
    class Fille : public Mere
    {
      ....
    }
    
    Mere* pointeurMere = new Fille();
    
    Fille* pointeurFille = quelcastutiliser<Fille*> pointeurMere;

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    Salut,

    Le static_cast n'effectue aucune vérification quant au fait que le transtypage est possible...

    Le dynamic_cast, pour sa part, renverra un pointeur NULL ou lancera une exception bad_cast si la convertion est impossible.

    Ainsi, si tu as plusieurs classes dérivées, le static_cast risque de poser quelques problèmes:
    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
     
    class Mere
    {
        /*...*/
    };
    class Prem:public Mere
    {
        /*...*/
    };
    class Second:public Mere
    {
        /*...*/
    };
     
    int main()
    {
        Mere* f=new Prem;
        /* ce transtypage fonctionne... mais... */
        Second *t1=static_cast<Second*>(f);
        /* ce transtypage échouera */
        Second *t2=dynamic_cast<Second*>(f);
        /* par contre, le transtypage sera correct si on travaille sur Prem ;) */
        Prem *p=dynamic_cast<Prem>(f);
    }
    Imaginons, maintenant, que dans Second, il y ait une fonction quelconque qui soit propre à cette classe... Que se passera-t-il si elle est appelée sur une variable issue d'un mauvais transtypage pour lequel tu aurais utilisé le static_cast

    [EDIT]Du point de vue des pures performances, le static_cast est plus rapide que le dynamic_cast... mais pose le problème qu'il faut etre sur que la convertion réussira
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Merci.

    Je suis bien au courant du risque que peut engendrer un downcast foireux...

    Mais dans mon cas, je sais exactement dans quelles conditions je fais ce cast et quelles fonctions je vais appeler dessus.

    J'aimerais eviter ça, mais c'est au prix de beaucoup de travail sur mon architecture, donc tant pis, je prend le risque !

    Habituellement j'utilise le dynamic_cast, mais sur 2-3 parties du code qui sont tres clairement definies (je sais ce que je downcast à coup sûr) et qui sont un peu sensibles en performances, je voudrais eviter des verifications inutiles...

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    C'était bien le sens de mon intervention...

    Je voulais m'assurer que tu étais au courent des risques, mais, si tu te trouve dans une portion de code dans laquelle tu es sur de ton coup, le static_cast présentera de meilleures performances
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Farpait !

    Merci !

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Une technique consiste à faire un static_cast en release, et en debug, à faire un dynamic_cast suivi d'un assert si ça n'a pas marché. Ca peut éviter des mauvaise surprises si on s'est trompé sur la validité du static_cast.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. Comment recevoir rapidement une réponse à votre question ?
    Par Community Management dans le forum Windows
    Réponses: 3
    Dernier message: 17/08/2014, 02h28
  2. [Zope]Comment apprendre rapidement Zope ??
    Par Oza dans le forum Zope
    Réponses: 1
    Dernier message: 25/03/2006, 19h26
  3. Réponses: 8
    Dernier message: 20/05/2005, 20h37
  4. Comment afficher rapidement des images ?
    Par Michel_57 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 16/01/2005, 04h07

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