(Courriels de diversion: <tentants@extrapoleriez-cloturaient.com> <mediteriez@hic-infligees.com> <harcellent@reaccoutumerions-ondulaient.com> <serpentait@excediez-perceptions.com> <ephemeres@visiterais-debouchais.com> <inopportunites@enerveras-insere.com> <generatif@decontenanceras-meconnaîtrez.com> <tachait@subodoreriez-surchauffions.com> <demarchai@forgeriez-tyranniques.com> <maturation@psychoses-indispose.com> )


  [J'ai effacé par mégarde le message initial, alors je réponds ici]

Le  2 Jan, Philippe Coulonges écrit :
> Le Thu, 02 Jan 2003 15:26:40 +0100 (CET)
> Laurent <laurent.marquez@free.fr> écrivait :> 
>> -> L'option ptr permet de specifier un repository pour 
>>    l'instantiation des templates.

> Pour "option" et "ptr" je n'ai pas pu déterminer l'intention de langue,
> mais ni "repository", ni "instantiation" ni "templates" ne sont dans
> mon Larousse.
> 
> Allez, encore un petit effort pour la communication, la solution à tes
> problèmes approchera tellement plus vite.

  En fait, c'est assez clair pour quelqu'un susceptible d'apporter une
réponse (et qui s'est frotté à divers compilateurs C++ commerciaux).

  Le repositoire dont il est question est en fait un cache dans lequel
le compilateur émet une version unique de chaque instanciation de classe
template, quel que soit le nombre d'instanciations identiques demandées.
Il s'agit là donc d'une question d'implantation d'une fonctionnalité du
langage.

  Pour mieux comprendre le problème, imaginons que nous ayons une
déclaration de classe template (c'est à dire paramétrée par un type ou
une constante) dans un fichier d'en-tête boulou.h :
template<class T, int I> class boulou {
   ...
}

puis deux instanciations dans des unités de compilation différentes :
tralala.C :
typedef class boulou<int, 3> tralala;
itou.C :
typedef class boulou<int, 3> itou;

  Un compilateur à repositoire (oui, j'aime bien ce néologisme) va
utiliser le cache pour ne générer qu'une seule fois le code de
l'instanciation boulou<int, 3> de la classe paramétrée.

  D'autres méthodes sont possibles. Les anciens g++ généraient autant de
fois le code de boulou<int, 3> qu'il y a d'unités de compilation qui en
ont besoin. C'est pas top, côté taille du code, quand ont utilise
lourdement les templates (comme il est devenu courant avec la STL :
Standard Template Library). Les anciens g++ permettent également de ne
générer le code qu'une seule fois (option -fexternal-templates), mais il
faut gérer cela soi-même à la main avec des pragma.

  Les g++ récents (avec un ld récent) génèrent autant de fois le code de
boulou<int, 3> qu'il y a d'unités de compilation qui en ont besoin, mais
signalent ce code à l'éditeur de lien, devenu suffisamment intelligent
pour éliminer les doublons dans le binaire final, sans qu'il y ait
besoin de rien faire.

  Mais il n'y a jamais eu d'équivalent du repositoire dans g++ (voir
cependant l'option -frepo qui fournit un mécanisme dont la fonction s'en
approche).

  Donc, Laurent, il faut en savoir plus, en particulier sur la version
de g++ et de ld que tu utilises, ainsi que sur l'OS sur lequel tu
compiles.

-- 
Marc Thirion                   | Ramonville Saint-Agne, France
Projet Internet et Citoyenneté : http://www.le-pic.org/



---------------------------------------------------------------------
Aide sur la liste: <URL:mailto:linux-31-help@CULTe.org>Le CULTe sur le web: <URL:http://www.CULTe.org/>