 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Stephane Wirtel Guest
|
Posted: Wed Apr 13, 2005 1:08 pm Post subject: Utilisation des templates ;-) |
|
|
Question sommaire concernant les templates.
Si à plusieurs fois dans un code je déclare plusieurs variables de type auto_ptr<TypeVariable>,
est-ce qu'il existera en mémoire plusieurs instances de cette classe ?
Je constate qu'à chaque fois que je fais appel à un template, la taille de mon executable augmente très fortement.
Je pensais que le compilateur factorisait les appels de templates semblables et ne crée qu'une seule classe descriptive du template,
ceci afin de gagner de la place mémoire.
Ai-je loupé quelque chose ?
Compilateur employé : bcc32 (aka Borland C++ Builder), pas testé sous linux.
Stéphane
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Wed Apr 13, 2005 8:21 pm Post subject: Re: Utilisation des templates ;-) |
|
|
Stephane Wirtel a écrit :
| Quote: | Question sommaire concernant les templates.
Si à plusieurs fois dans un code je déclare plusieurs variables de type
auto_ptr<TypeVariable>,
est-ce qu'il existera en mémoire plusieurs instances de cette classe ?
|
Il n'y a pas de raisons, mais le compilateur est libre de faire comme il
souhaite. Potentiellement, on pourrait imaginer des cas où ça pourrait
être intéressant de dupliquer (pour une variable, il vaut mieux avoir
telle fonction inline, pour l'autre non), mais pas plus que si on crée
deux variables d'une même classe non template.
| Quote: | Je constate qu'à chaque fois que je fais appel à un template, la taille
de mon executable augmente très fortement.
|
Ah ? Et n'est-ce pas du simplement à la taille pour stocker cette variable ?
--
Loïc
|
|
| Back to top |
|
 |
Olivier Azeau Guest
|
Posted: Wed Apr 13, 2005 10:39 pm Post subject: Re: Utilisation des templates ;-) |
|
|
Loïc Joly wrote:
| Quote: | Stephane Wirtel a écrit :
Je constate qu'à chaque fois que je fais appel à un template, la
taille de mon executable augmente très fortement.
Ah ? Et n'est-ce pas du simplement à la taille pour stocker cette
variable ?
|
Je vois comme une ambiguïté sur le terme "exécutable" dans cette discussion.
|
|
| Back to top |
|
 |
Aurélien REGAT-BARREL Guest
|
Posted: Thu Apr 14, 2005 7:54 am Post subject: Re: Utilisation des templates ;-) |
|
|
Stephane Wirtel wrote:
| Quote: | Je constate qu'à chaque fois que je fais appel à un template, la
taille de mon executable augmente très fortement.
|
Faut voir ce que signifie très fortement.
BCB possède un smart linker il me semble. Donc il vire toutes les fonctions
(de la lib standard entre autre) qui ne sont pas utilisées (à moins que tu
compiles pour utiliser une dll). Si ton template fait appel à des fonctions
qui jusque là n'étaient utilisées nul part, peut être est-ce une
explication...
--
Aurélien REGAT-BARREL
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu Apr 14, 2005 9:07 am Post subject: Re: Utilisation des templates ;-) |
|
|
Stephane Wirtel wrote:
| Quote: | Question sommaire concernant les templates.
Si à plusieurs fois dans un code je déclare plusieurs
variables de type auto_ptr<TypeVariable>, est-ce qu'il
existera en mémoire plusieurs instances de cette classe ?
|
Qu'est-ce que tu entends par « instances » ? Normalement, on
dirait qu'il y a une instance par variable, plus une instance
par temporaire. Mais ce sont des objets créés lors de
l'exécution, et qui ne se trouvent pas dans le fichier
exécutable.
| Quote: | Je constate qu'à chaque fois que je fais appel à un template,
la taille de mon executable augmente très fortement.
|
Chaque fois que tu l'instancies avec des paramètres différents,
c'est normal que la taille de l'exécutable augmente. De combien,
ça dépend du template -- pour auto_ptr, je m'attendrais à assez
peu.
| Quote: | Je pensais que le compilateur factorisait les appels de
templates semblables et ne crée qu'une seule classe
descriptive du template, ceci afin de gagner de la place
mémoire.
|
Qu'est-ce que tu entends par « semblables » ? Si les paramètres
sont différents, il faut que les adresses des fonctions soient
différentes. Si les paramètres sont identiques, il faut que
les adresses soient les mêmes partout. En fin de compte, le
compilateur n'a pas beaucoup de liberté là-dedans. Sauf,
évidemment, s'il optimise ; il peut bien mettre les appels de
fonction inline, par exemple.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Vincent Lascaux Guest
|
Posted: Thu Apr 14, 2005 9:14 am Post subject: Re: Utilisation des templates ;-) |
|
|
| Quote: | Si les paramètres sont identiques, il faut que
les adresses soient les mêmes partout.
|
Pour les fonctions qui ne dépendent pas du tout du paramètre, il peut
utiliser la même fonction.
Pour les fonctions qui ne dépendent du paramètre qu'en un endroit bien
précis, il pourrait découper la fonction en une fonction qui dépend du
paramètre et une fonction qui n'en dépend pas.
Par exemple (bidon comme il se doit)
template<class T>
void write(const T& t)
{
std::string s = boost::lexical_cast(t);
//Traitement long qui n'utilise que s
}
Pourait être remplacé par
template<class T>
void write(const T& t)
{
traitementLong(boost::lexical_cast(t));
}
void traitementLong(const std::string& s)
{
//Traitement long qui n'utilise que s
}
--
Vincent
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Apr 15, 2005 9:03 am Post subject: Re: Utilisation des templates ;-) |
|
|
Vincent Lascaux wrote:
| Quote: | Si les paramètres sont identiques, il faut que
les adresses soient les mêmes partout.
Pour les fonctions qui ne dépendent pas du tout du paramètre,
il peut utiliser la même fonction.
Pour les fonctions qui ne dépendent du paramètre qu'en un
endroit bien précis, il pourrait découper la fonction en une
fonction qui dépend du paramètre et une fonction qui n'en
dépend pas. Par exemple (bidon comme il se doit)
template
void write(const T& t)
{
std::string s = boost::lexical_cast(t);
//Traitement long qui n'utilise que s
}
Pourait être remplacé par
template
void write(const T& t)
{
traitementLong(boost::lexical_cast(t));
}
void traitementLong(const std::string& s)
{
//Traitement long qui n'utilise que s
}
|
Ce n'est pas si évident que ça. Si traitementLong contient une
variable statique, par exemple, il faut qu'il y ait une instance
par instantiation du template.
Sinon, ça exige une certaine intelligencee du compilateur. Plus
que ce qui est actuellement courante. C'est faisable, mais les
compilateurs actuels qui poussent l'analyse au maximum le font
en général en vue d'optimiser les temps d'exécution, non pour
minimiser la taille de l'exécutable. Ajouter un appel de
fonction là où il n'y avait pas dans la source, ça n'améliore
pas le temps d'exécution (mais si le traitement est long, ça ne
doit pas le rendre pire de façon mésurable non plus).
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|