C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Utilisation des templates ;-)

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Stephane Wirtel
Guest





PostPosted: Wed Apr 13, 2005 1:08 pm    Post subject: Utilisation des templates ;-) Reply with 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 ?

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





PostPosted: Wed Apr 13, 2005 8:21 pm    Post subject: Re: Utilisation des templates ;-) Reply with quote



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





PostPosted: Wed Apr 13, 2005 10:39 pm    Post subject: Re: Utilisation des templates ;-) Reply with quote



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





PostPosted: Thu Apr 14, 2005 7:54 am    Post subject: Re: Utilisation des templates ;-) Reply with quote

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





PostPosted: Thu Apr 14, 2005 9:07 am    Post subject: Re: Utilisation des templates ;-) Reply with quote

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





PostPosted: Thu Apr 14, 2005 9:14 am    Post subject: Re: Utilisation des templates ;-) Reply with quote

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





PostPosted: Fri Apr 15, 2005 9:03 am    Post subject: Re: Utilisation des templates ;-) Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.