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 

Re: static - je ne comprends pas

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





PostPosted: Sat Aug 02, 2003 10:03 pm    Post subject: Re: static - je ne comprends pas Reply with quote



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





PostPosted: Sat Aug 02, 2003 10:32 pm    Post subject: Re: static - je ne comprends pas Reply with quote



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





PostPosted: Mon Aug 04, 2003 2:20 pm    Post subject: Re: static - je ne comprends pas Reply with quote



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





PostPosted: Mon Aug 04, 2003 2:25 pm    Post subject: Re: static - je ne comprends pas Reply with quote

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





PostPosted: Tue Aug 19, 2003 2:43 pm    Post subject: Re: static - je ne comprends pas Reply with quote

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
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.