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