 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Richard Delorme Guest
|
Posted: Sat Aug 02, 2003 10:03 pm Post subject: Re: static - je ne comprends pas |
|
|
Matthieu a écrit :
| Quote: | Bonjour,
Quelque chose m'échappe dans le code si dessous.
L'idée du "static buf" c'était pour éviter d'avoir à utiliser la pile.
Evidemment si je déclare "static string buf;" à l'extérieur cela marche.
Quelqu'un pourrait-il m'expliquer pour ce static en plein milieu d'une
fonction n'est affecté qu'une seule fois ?
|
parce que tu l'initialises.
| Quote: | void parse_size(const string &sss)
{
cout << "[sss]=" << sss << "=" << endl;
static string buf = sss;
|
affectation dans une déclaration = initialisation. (c'est le constructeur de
copie qui est appelé ici).
Pour avoir une affectation, il faut le faire en deux temps :
static string buf; // <- constructeur par défaut appelé 1 fois
buf = sss; // <- opérateur d'affectation appelé à chaque fois.
--
Richard
|
|
| Back to top |
|
 |
Matthieu Guest
|
Posted: Sat Aug 02, 2003 10:32 pm Post subject: Re: static - je ne comprends pas |
|
|
Voilà un exemple plus simple.
#include <iostream>
using namespace std;
void f(int a)
{
static int b = a;
std::cout << a << endl;
std::cout << b << endl;
}
int main()
{
f(1);
f(2);
}
En fait ce qui me bloque c'est que je "vois" que le code (re)passe à
l'endroit.
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Mon Aug 04, 2003 2:20 pm Post subject: Re: static - je ne comprends pas |
|
|
Jonathan Mcdougall <DELjonathanmcdougall (AT) yahoo (DOT) ca> wrote
| Quote: | On Sun, 3 Aug 2003 00:13:00 +0200, "Matthieu" <no.spam (AT) here (DOT) fr> wrote:
|
| Quote: | Quelque chose m'échappe dans le code si dessous. L'idée du "static
buf" c'était pour éviter d'avoir à utiliser la pile. Evidemment si je
déclare "static string buf;" à l'extérieur cela marche.
Quelqu'un pourrait-il m'expliquer pour ce static en plein milieu
d'une fonction n'est affecté qu'une seule fois ?
|
En fait, il n'est jamais affecté. Il est initialisé une fois, comme le
veut la norme.
| Quote: | ---------------------------------------
#include
#include
using namespace std;
void parse_size(const string &sss)
{
cout << "[sss]=" << sss << "=" << endl;
static string buf = sss;
cout << "[buf]=" << buf << "=" << endl;
}
int main()
{
parse_size("10M");
parse_size("841k");
}
/*
[sss]=10M=
[buf]=10M=
[sss]=841k=
[buf]=10M=
*/
---------------------------------------
La raison pour laquelle on utilise un objet statique dans une fonction
est que l'on ne veut pas qu'il soit réalloué à chaque passage.
|
La raison principale pour laquelle on utilise un objet statique dans une
fonction, c'est qu'on veut qu'il garde sa valeur entre plusieurs appels
de la fonction ; c'est qu'on veut qu'il ne soit initialisé qu'une seule
fois.
| Quote: | Ce genre d'optimisation ne devrait pas être faite à la légère :
lorsque ton application sera terminée, vérifie si cet objet prend
vraiment du temps au runtime. Si oui, tu pourras le mettre statique.
"Premature optimization is the root of all evil".
|
Surtout que dans le cas d'un statique dans une fonction, c'est souvent
une pessimisation. Sauf qu'on ne peut pas trop comparer, parce que la
sémantique n'est pas la même.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
Jonathan Mcdougall Guest
|
Posted: Mon Aug 04, 2003 2:25 pm Post subject: Re: static - je ne comprends pas |
|
|
| Quote: | La raison pour laquelle on utilise un objet statique dans une fonction
est que l'on ne veut pas qu'il soit réalloué à chaque passage.
La raison principale pour laquelle on utilise un objet statique dans une
fonction, c'est qu'on veut qu'il garde sa valeur entre plusieurs appels
de la fonction ; c'est qu'on veut qu'il ne soit initialisé qu'une seule
fois.
|
Tu as raison, désolé, je ne sais pas pourquoi j'ai écris ça.
Jonathan
|
|
| Back to top |
|
 |
Christophe de Vienne Guest
|
Posted: Tue Aug 19, 2003 2:43 pm Post subject: Re: static - je ne comprends pas |
|
|
Matthieu wrote:
| Quote: |
L'idée du "static buf" c'était pour éviter d'avoir à utiliser la pile.
|
Quel intérêt ?
Dans ton cas tu utilise std::string, dont la mémoire contenant la chaine est
gérée dynamiquement, et ne risque pas de se retrouver sur la pile.
De plus, pour éviter d'utiliser la pile on utilise un pointeur, ou même un
pointeur intelligent pour ne pas avoir à gérer à la main la durée de vie de
l'instance.
A+
Christophe
--
Christophe de Vienne
Experience is something you don't get until just after you need it.
Oliver's Law.
|
|
| 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
|
|