OVH Cloud OVH Cloud

initialisation static

7 réponses
Avatar
Bruno Causse
bonjour,

en java il existe un intialisation statique des classes (cad des le 1er new
ou le 1er appel static), un morceau de code est executé, generalement pour
initialiser la classe (ex: charger des resources), ce code n'est executé (en
simplifiant) qu'une seul fois bien sur.

quel mecamisme peut il etre implementé en c++?

je ne vois qu'un static boolean init; qui serait testé dans chaque
constructeurs et methodes static.

une autre solution?

--
bruno

7 réponses

Avatar
Fabien LE LEZ
On Fri, 12 Jan 2007 15:07:37 +0100, "Bruno Causse"
:

en java il existe un intialisation statique des classes (cad des le 1er new
ou le 1er appel static), un morceau de code est executé, generalement pour
initialiser la classe (ex: charger des resources), ce code n'est executé (en
simplifiant) qu'une seul fois bien sur.


Une solution : mettre, dans chaque constructeur de la classe, une
fonction (membre, privée) du style :

void Classe::Init()
{
static bool premier_appel= true;
if (premier_appel)
{
InitialiseCeQuIlFaut();
premier_appel= false;
}
}

Avatar
Marc Boyer
Le 12-01-2007, Bruno Causse a écrit :
en java il existe un intialisation statique des classes (cad des le 1er new
ou le 1er appel static), un morceau de code est executé, generalement pour
initialiser la classe (ex: charger des resources), ce code n'est executé (en
simplifiant) qu'une seul fois bien sur.

quel mecamisme peut il etre implementé en c++?

je ne vois qu'un static boolean init; qui serait testé dans chaque
constructeurs et methodes static.

une autre solution?


Il faut surtout préciser que Java permet de faire une partie
de la construction hors du code des constructeurs eux-même.
Pour faire cette notion de 'code commun à tous les constructeurs'
en C++ il faut déjà tout regrouper dans une fonction (ou un
peu d'héritage et un constructeur, ou d'autres choses du genre),
et appeller cette fonction dans tous les constructeurs.
Pour le static, c'est pareil avec un booleen static comme
garde.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)

Avatar
Bruno Causse
"Fabien LE LEZ" a écrit dans le message de news:

On Fri, 12 Jan 2007 15:07:37 +0100, "Bruno Causse"
:

Une solution : mettre, dans chaque constructeur de la classe, une
fonction (membre, privée) du style :


oui c'est la meme, j'ai cru lire (mais je ne le retrouve plus) une solution
a base de mutex.

je phantasme?

Avatar
Laurent Deniau
Bruno Causse wrote:
bonjour,

en java il existe un intialisation statique des classes (cad des le 1er new
ou le 1er appel static), un morceau de code est executé, generalement pour
initialiser la classe (ex: charger des resources), ce code n'est executé (en
simplifiant) qu'une seul fois bien sur.

quel mecamisme peut il etre implementé en c++?


Il est possible de faire qqchose de similaire en initialisant une
variable a portee statique avec la valeur de retour d'une fonction
(expression non constante) qui sera executee avant que le "main" ait la
main. Mais ca ne garanti pas que le code sera execute avant toute
utilisation de la classe, si par exemple une autre classe utilise ce
meme procede utilisant cette classe... Il faut alors meme des flags un
peu partout pour controler l'ordre d'execution qui n'est pas garanti par
C++.

je ne vois qu'un static boolean init; qui serait testé dans chaque
constructeurs et methodes static.


yep, sinon je ne vois que ca (cf post de Fabien).

a+, ld.

Avatar
Fabien LE LEZ
On Fri, 12 Jan 2007 15:33:54 +0100, "Bruno Causse"
:

j'ai cru lire (mais je ne le retrouve plus) une solution
a base de mutex.


Généralement, si on parle de mutex, c'est qu'on s'attaque à la
programmation multithread.

Avatar
Bruno Causse
"Fabien LE LEZ" a écrit dans le message de news:

On Fri, 12 Jan 2007 15:33:54 +0100, "Bruno Causse"
:

j'ai cru lire (mais je ne le retrouve plus) une solution
a base de mutex.


Généralement, si on parle de mutex, c'est qu'on s'attaque à la
programmation multithread.



voila :

http://monge.univ-mlv.fr/~roussel/DESS/once.html

mais c'est posix (non standard), mais tres courant.


Avatar
Fabien LE LEZ
On Fri, 12 Jan 2007 16:19:16 +0100, "Bruno Causse"
:

http://monge.univ-mlv.fr/~roussel/DESS/once.html
[pthread_once]


mais c'est posix (non standard)


<pinaillage> POSIX est un standard. </pinaillage>

, mais tres courant.


Très courant ? T'es sûr ?

A priori, c'est bien un truc spécifique à la programmation
multi-thread, dans des cas particuliers d'initialisation qui doit se
faire après le démarrage des threads "secondaires".

D'après "Programming with POSIX threads" (Butenhof), chapitre 5.1,
cette fonction servait principalement à l'initialisation de mutex, à
l'époque où il n'était pas possible de les intialiser de façon
statique.

Enfin bon, dans un contexte mono-thread (ce qui est le cas d'un sacré
paquet de code, y compris dans des applications multithreads), tout ça
n'a guère d'intérêt.


Il me semble que dans un contexte multithread, du code moderne
ressemblerait plus à :

void f()
{
Mutex un_mutex; // "Mutex" est la classe mutex de ton choix
static bool premier_appel= true;
if (premier_appel)
{
//Ici, l'initialisation proprement dite
premier_appel= false;
}
}// RAII -- le mutex est libéré à la sortie de la fonction