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 des templates


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut instanciation des templates
    http://cpp.developpez.com/cours/cpp/?page=page_14#LXIV

    "Enfin, ce qui est le plus grave, c'est que les instances des template sont en multiples exemplaires dans les fichiers objets générés par le compilateur"


    Si dans un projet on utilise dans 2 fonction un std::vector<int> v; , dans le binaire cette classe sera présente 2 fois ?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    http://cpp.developpez.com/cours/cpp/?page=page_14#LXIV

    "Enfin, ce qui est le plus grave, c'est que les instances des template sont en multiples exemplaires dans les fichiers objets générés par le compilateur"


    Si dans un projet on utilise dans 2 fonction un std::vector<int> v; , dans le binaire cette classe sera présente 2 fois ?
    Le risque est effectivement présent, surtout si tu utilise un std::vector<int> dans deux unités de compilation séparées.
    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 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
    Par défaut
    Hello

    Voilà qui est intéressant. Que se passe-t-il dans le cas où deux unités de compilation s'échangent via des méthodes des std::vector ? Il y a aura deux classes dans le binaire, mais strictement identiques ?

  4. #4
    screetch
    Invité(e)
    Par défaut
    en general, le code n'est pas dupliqué dans l'executable final. La plupart des linker fusionnent les méthodes dont le code généré est identique.
    ce qui les conduit même parfois a fusionner std::vector<int> et std::vector<float>, et std::vector<A*> et std::vector<B*>
    Dernière modification par screetch ; 04/04/2011 à 15h05.

  5. #5
    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
    Par défaut
    Je me disais aussi... ça ferait trop gonfler l'empreinte pour rien.

  6. #6
    screetch
    Invité(e)
    Par défaut
    bah oui
    ca poserait aussi d'enormes problèmes pour les variables statiques des classes templates; il n'y en aurait pas une pour le programme mais une par module, donc deux modules ne parleraient pas à la même variable... "woups!"

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    Citation Envoyé par screetch Voir le message
    ce qui les conduit même parfois a fusionner std::vector<int> et std::vector<float>, et std::vector<A*> et std::vector<B*>


    TU aurais un peu plus de détails ?

  8. #8
    screetch
    Invité(e)
    Par défaut
    Si le code généré est abolument identique pourquoi en avoir plusieurs versions (une copie en quelques sortes?)
    Certains linker fusionnent donc les methodes qui ont exactement le meme code assembleur généré.
    vector<int> et vector<float> pourraient en faire partie, par exemple. A part gérer des données de 32 bits de long, y'a pas de code spécialisé.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    C'est, en réalité, beaucoup plus comlexe que cela...

    Ce dont on est sur tient en plusieurs points:
    1. Le code d'une classe template est, a priori, inliné car le compilateur ne peux créer le code binaire correspondant qu'une fois qu'il sait quel est le type du (des) paramètre(s) template
    2. Le compilateur oublie, d'une unité de compilation à l'autre, ce qu'il a pu faire
    3. Le compilateur reste seul juge de l'opportunité d'inliner (ou non) une fonction déclarée (de manière implicite ou explicite) inline
    4. Si le code d'une fonction (membre d'une classe) template est utilisé, il est très certainement généré au niveau binaire, ce qui ne veut pas dire (tout dépend du compilateur) que l'ensemble des fonctions de la classe template (s'il échoit) le sera d'office
    A partir de là, on peut être tenté de tirer quelques conclusions, qui peuvent parfaitement s'avérer non fondées, telles que:

    • Le code binaire ne sera peut être généré pour l'ensemble d'une classe que pour les instances de celle-ci (par opposition aux références / pointeurs sur les instances de la classe), dans le fichiers où les dites instances sont créées
    • Il n'est pas exclu que l'appelle d'une fonction donnée occasionne l'inlining de celle-ci, et donc sa présence à l'intérieur du binaire, à la place où elle est appelée
    • ...
    Là dessus, il faut aussi prendre l'éventualité de l'instanciation explicite, entre autres pour les types primitifs.

    Il n'est donc pas exclu, malgré tout, que l'ensemble de std::vector<int> se trouve dans libstdxx.a (sous gcc) et que le code ne soit pas forcément inliné chaque fois que l'on a une variable de ce type.

    Et ce n'est qu'un aperçu rapide du problème qu'il peut y avoir à donner une réponse par trop affirmative
    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

Discussions similaires

  1. Utilisation des templates
    Par vanitom dans le forum MFC
    Réponses: 21
    Dernier message: 01/08/2007, 11h07
  2. Réponses: 1
    Dernier message: 18/04/2006, 12h24
  3. [XSL]portée des templates??
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 23/02/2006, 10h53
  4. [XSL] utilisation des templates
    Par KibitO dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 16/12/2005, 15h54
  5. Utilisation des templates
    Par mikky dans le forum C++
    Réponses: 1
    Dernier message: 14/09/2005, 12h59

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