On Mar 14, 10:40 am, Michael DOUBEZ wrote:On Mar 13, 9:33 pm, Michael DOUBEZ wrote:
[...]
C'est assez proche du singleton. Pourquoi pas en faire une
véritable singleton :
C'est un singleton avec une fonction custom d'initalisation à cause
de l'initialisation statique des variables.
Je ne comprends pas trop. Est-ce que c'est un singleton ou
non ? Moi, ce que je voyais, c'est que le map se comporte comme
un singleton. La plus simple, alors, serait de le wrapper pour
faire l'initialisation, et ensuite, le gerer comme un singleton.
std::map<...>&
X::get()
{
static::map<...>* theOneAndOnly = createMap() ;
return *theOneAndOnly ;
}
avec :
std::map<...>*
createMap()
{
std::map<...>* result = new std::map<...> ;
// initialisation du map...
return result ;
}
Oui, c'est beaucoup plus clair et peut être avec un auto_ptr<> pour être
100% propre.
Au contraire. Tout l'intérêt de cette solution, c'est que
l'objet n'est jamais detruit. Ou surtout, si on préfère, qu'il
n'est pas détruit avant que quelqu'un s'en sert dans le
destructeur d'un autre objet statique.
Ça a aussi l'avantage d'éliminer les risques dues à l'ordre de
destruction. (J'avoue ne jamais avoir eu de problèmes de cette
côté-là, mais en principe, elles existent.)
Enfin, il faut faire gaffe aux threads dans ces cas-là. La
construction des statiques locales n'est pas thread safe, au
moins dans les compilateurs courants. Du coup, il faudrait soit
s'assurer que la fonction est appelée au moins une fois avant le
démarrage des threads, soit y introduire des locks.
J'attends avec impatience le prochain standard qui je l'espère apportera
des solutions élégantes aux statiques partagées.
Je ne sais pas ce que tu attends. Une solution générale coûte
assez chère, et n'est que rarement nécessaire. Alors, selon le
principe de ne pas payer pour ce dont tu ne te sers pas...
Il me semble que gcc 4.x inclut automatiquement un lock pour protégé
l'initialisation des statiques.
Non. Il génère un espèce de bricolage qui ne marche pas sur les
plateformes que je connais. Je le désactive systèmatiquement,
pour éviter des problèmes.
C'est vrai que sous les Unix, il aurait pu se servir de
pthread_once, qui lui est garanti de marcher. A priori, on
s'attendrait aussi à ce que les implémenteurs du système aient
utiliser la solution la plus efficace pour le système. A
priori... j'avoue qu'il m'est arrivé d'être deçu dans ce genre
d'attente dans la passée.
On Mar 14, 10:40 am, Michael DOUBEZ <michael.dou...@free.fr> wrote:
On Mar 13, 9:33 pm, Michael DOUBEZ <michael.dou...@free.fr> wrote:
[...]
C'est assez proche du singleton. Pourquoi pas en faire une
véritable singleton :
C'est un singleton avec une fonction custom d'initalisation à cause
de l'initialisation statique des variables.
Je ne comprends pas trop. Est-ce que c'est un singleton ou
non ? Moi, ce que je voyais, c'est que le map se comporte comme
un singleton. La plus simple, alors, serait de le wrapper pour
faire l'initialisation, et ensuite, le gerer comme un singleton.
std::map<...>&
X::get()
{
static::map<...>* theOneAndOnly = createMap() ;
return *theOneAndOnly ;
}
avec :
std::map<...>*
createMap()
{
std::map<...>* result = new std::map<...> ;
// initialisation du map...
return result ;
}
Oui, c'est beaucoup plus clair et peut être avec un auto_ptr<> pour être
100% propre.
Au contraire. Tout l'intérêt de cette solution, c'est que
l'objet n'est jamais detruit. Ou surtout, si on préfère, qu'il
n'est pas détruit avant que quelqu'un s'en sert dans le
destructeur d'un autre objet statique.
Ça a aussi l'avantage d'éliminer les risques dues à l'ordre de
destruction. (J'avoue ne jamais avoir eu de problèmes de cette
côté-là, mais en principe, elles existent.)
Enfin, il faut faire gaffe aux threads dans ces cas-là. La
construction des statiques locales n'est pas thread safe, au
moins dans les compilateurs courants. Du coup, il faudrait soit
s'assurer que la fonction est appelée au moins une fois avant le
démarrage des threads, soit y introduire des locks.
J'attends avec impatience le prochain standard qui je l'espère apportera
des solutions élégantes aux statiques partagées.
Je ne sais pas ce que tu attends. Une solution générale coûte
assez chère, et n'est que rarement nécessaire. Alors, selon le
principe de ne pas payer pour ce dont tu ne te sers pas...
Il me semble que gcc 4.x inclut automatiquement un lock pour protégé
l'initialisation des statiques.
Non. Il génère un espèce de bricolage qui ne marche pas sur les
plateformes que je connais. Je le désactive systèmatiquement,
pour éviter des problèmes.
C'est vrai que sous les Unix, il aurait pu se servir de
pthread_once, qui lui est garanti de marcher. A priori, on
s'attendrait aussi à ce que les implémenteurs du système aient
utiliser la solution la plus efficace pour le système. A
priori... j'avoue qu'il m'est arrivé d'être deçu dans ce genre
d'attente dans la passée.
On Mar 14, 10:40 am, Michael DOUBEZ wrote:On Mar 13, 9:33 pm, Michael DOUBEZ wrote:
[...]
C'est assez proche du singleton. Pourquoi pas en faire une
véritable singleton :
C'est un singleton avec une fonction custom d'initalisation à cause
de l'initialisation statique des variables.
Je ne comprends pas trop. Est-ce que c'est un singleton ou
non ? Moi, ce que je voyais, c'est que le map se comporte comme
un singleton. La plus simple, alors, serait de le wrapper pour
faire l'initialisation, et ensuite, le gerer comme un singleton.
std::map<...>&
X::get()
{
static::map<...>* theOneAndOnly = createMap() ;
return *theOneAndOnly ;
}
avec :
std::map<...>*
createMap()
{
std::map<...>* result = new std::map<...> ;
// initialisation du map...
return result ;
}
Oui, c'est beaucoup plus clair et peut être avec un auto_ptr<> pour être
100% propre.
Au contraire. Tout l'intérêt de cette solution, c'est que
l'objet n'est jamais detruit. Ou surtout, si on préfère, qu'il
n'est pas détruit avant que quelqu'un s'en sert dans le
destructeur d'un autre objet statique.
Ça a aussi l'avantage d'éliminer les risques dues à l'ordre de
destruction. (J'avoue ne jamais avoir eu de problèmes de cette
côté-là, mais en principe, elles existent.)
Enfin, il faut faire gaffe aux threads dans ces cas-là. La
construction des statiques locales n'est pas thread safe, au
moins dans les compilateurs courants. Du coup, il faudrait soit
s'assurer que la fonction est appelée au moins une fois avant le
démarrage des threads, soit y introduire des locks.
J'attends avec impatience le prochain standard qui je l'espère apportera
des solutions élégantes aux statiques partagées.
Je ne sais pas ce que tu attends. Une solution générale coûte
assez chère, et n'est que rarement nécessaire. Alors, selon le
principe de ne pas payer pour ce dont tu ne te sers pas...
Il me semble que gcc 4.x inclut automatiquement un lock pour protégé
l'initialisation des statiques.
Non. Il génère un espèce de bricolage qui ne marche pas sur les
plateformes que je connais. Je le désactive systèmatiquement,
pour éviter des problèmes.
C'est vrai que sous les Unix, il aurait pu se servir de
pthread_once, qui lui est garanti de marcher. A priori, on
s'attendrait aussi à ce que les implémenteurs du système aient
utiliser la solution la plus efficace pour le système. A
priori... j'avoue qu'il m'est arrivé d'être deçu dans ce genre
d'attente dans la passée.
[snip]Au contraire. Tout l'intérêt de cette solution, c'est que
l'objet n'est jamais detruit. Ou surtout, si on préfère, qu'il
n'est pas détruit avant que quelqu'un s'en sert dans le
destructeur d'un autre objet statique.
Un programme/OS est garanti de rendre toutes les ressources a la
terminaison ? J'ai des souvenirs de code sous Windows 3.1 qui polluaient
la mémoire.
[snip]
Au contraire. Tout l'intérêt de cette solution, c'est que
l'objet n'est jamais detruit. Ou surtout, si on préfère, qu'il
n'est pas détruit avant que quelqu'un s'en sert dans le
destructeur d'un autre objet statique.
Un programme/OS est garanti de rendre toutes les ressources a la
terminaison ? J'ai des souvenirs de code sous Windows 3.1 qui polluaient
la mémoire.
[snip]Au contraire. Tout l'intérêt de cette solution, c'est que
l'objet n'est jamais detruit. Ou surtout, si on préfère, qu'il
n'est pas détruit avant que quelqu'un s'en sert dans le
destructeur d'un autre objet statique.
Un programme/OS est garanti de rendre toutes les ressources a la
terminaison ? J'ai des souvenirs de code sous Windows 3.1 qui polluaient
la mémoire.
[snip]Au contraire. Tout l'intérêt de cette solution, c'est que
l'objet n'est jamais detruit. Ou surtout, si on préfère, qu'il
n'est pas détruit avant que quelqu'un s'en sert dans le
destructeur d'un autre objet statique.
Un programme/OS est garanti de rendre toutes les ressources a la
terminaison ? J'ai des souvenirs de code sous Windows 3.1 qui
polluaient la mémoire.
En fait, la question ne se pose pas aujourd'hui dans la plupart des
système. C'est juste que j'aime tout nettoyer en sortant :)
[snip]
Au contraire. Tout l'intérêt de cette solution, c'est que
l'objet n'est jamais detruit. Ou surtout, si on préfère, qu'il
n'est pas détruit avant que quelqu'un s'en sert dans le
destructeur d'un autre objet statique.
Un programme/OS est garanti de rendre toutes les ressources a la
terminaison ? J'ai des souvenirs de code sous Windows 3.1 qui
polluaient la mémoire.
En fait, la question ne se pose pas aujourd'hui dans la plupart des
système. C'est juste que j'aime tout nettoyer en sortant :)
[snip]Au contraire. Tout l'intérêt de cette solution, c'est que
l'objet n'est jamais detruit. Ou surtout, si on préfère, qu'il
n'est pas détruit avant que quelqu'un s'en sert dans le
destructeur d'un autre objet statique.
Un programme/OS est garanti de rendre toutes les ressources a la
terminaison ? J'ai des souvenirs de code sous Windows 3.1 qui
polluaient la mémoire.
En fait, la question ne se pose pas aujourd'hui dans la plupart des
système. C'est juste que j'aime tout nettoyer en sortant :)
On Mar 14, 10:40 am, Michael DOUBEZ wrote:On Mar 13, 9:33 pm, Michael DOUBEZ wrote:
[...]
C'est assez proche du singleton. Pourquoi pas en faire une
véritable singleton :
C'est un singleton avec une fonction custom d'initalisation à cause
de l'initialisation statique des variables.
Je ne comprends pas trop. Est-ce que c'est un singleton ou
non ? Moi, ce que je voyais, c'est que le map se comporte comme
un singleton. La plus simple, alors, serait de le wrapper pour
faire l'initialisation, et ensuite, le gerer comme un singleton.
Je voulais garder le principe d'une static de class de l'OP sans
allocation par new.
C'est un singleton (de mon point de vue).
std::map<...>&
X::get()
{
static::map<...>* theOneAndOnly = createMap() ;
return *theOneAndOnly ;
}
avec :
std::map<...>*
createMap()
{
std::map<...>* result = new std::map<...> ;
// initialisation du map...
return result ;
}
Oui, c'est beaucoup plus clair et peut être avec un auto_ptr<> pour être
100% propre.
Au contraire. Tout l'intérêt de cette solution, c'est que
l'objet n'est jamais detruit. Ou surtout, si on préfère, qu'il
n'est pas détruit avant que quelqu'un s'en sert dans le
destructeur d'un autre objet statique.
Un programme/OS est garanti de rendre toutes les ressources a la
terminaison ?
Ça a aussi l'avantage d'éliminer les risques dues à l'ordre de
destruction. (J'avoue ne jamais avoir eu de problèmes de cette
côté-là, mais en principe, elles existent.)
Enfin, il faut faire gaffe aux threads dans ces cas-là. La
construction des statiques locales n'est pas thread safe, au
moins dans les compilateurs courants. Du coup, il faudrait soit
s'assurer que la fonction est appelée au moins une fois avant le
démarrage des threads, soit y introduire des locks.
J'attends avec impatience le prochain standard qui je l'espère appor tera
des solutions élégantes aux statiques partagées.
Je ne sais pas ce que tu attends. Une solution générale coûte
assez chère, et n'est que rarement nécessaire. Alors, selon le
principe de ne pas payer pour ce dont tu ne te sers pas...
Un simple mutex standard pouvant être initialisé de façon statique et
atomique me convient.
Maintenant, si un nouveau keyword me permet d'assurer qu'une
initialisation static ne se fait qu'une fois ou même qu'une opération se
fait de façon atomique, c'est royal.
On Mar 14, 10:40 am, Michael DOUBEZ <michael.dou...@free.fr> wrote:
On Mar 13, 9:33 pm, Michael DOUBEZ <michael.dou...@free.fr> wrote:
[...]
C'est assez proche du singleton. Pourquoi pas en faire une
véritable singleton :
C'est un singleton avec une fonction custom d'initalisation à cause
de l'initialisation statique des variables.
Je ne comprends pas trop. Est-ce que c'est un singleton ou
non ? Moi, ce que je voyais, c'est que le map se comporte comme
un singleton. La plus simple, alors, serait de le wrapper pour
faire l'initialisation, et ensuite, le gerer comme un singleton.
Je voulais garder le principe d'une static de class de l'OP sans
allocation par new.
C'est un singleton (de mon point de vue).
std::map<...>&
X::get()
{
static::map<...>* theOneAndOnly = createMap() ;
return *theOneAndOnly ;
}
avec :
std::map<...>*
createMap()
{
std::map<...>* result = new std::map<...> ;
// initialisation du map...
return result ;
}
Oui, c'est beaucoup plus clair et peut être avec un auto_ptr<> pour être
100% propre.
Au contraire. Tout l'intérêt de cette solution, c'est que
l'objet n'est jamais detruit. Ou surtout, si on préfère, qu'il
n'est pas détruit avant que quelqu'un s'en sert dans le
destructeur d'un autre objet statique.
Un programme/OS est garanti de rendre toutes les ressources a la
terminaison ?
Ça a aussi l'avantage d'éliminer les risques dues à l'ordre de
destruction. (J'avoue ne jamais avoir eu de problèmes de cette
côté-là, mais en principe, elles existent.)
Enfin, il faut faire gaffe aux threads dans ces cas-là. La
construction des statiques locales n'est pas thread safe, au
moins dans les compilateurs courants. Du coup, il faudrait soit
s'assurer que la fonction est appelée au moins une fois avant le
démarrage des threads, soit y introduire des locks.
J'attends avec impatience le prochain standard qui je l'espère appor tera
des solutions élégantes aux statiques partagées.
Je ne sais pas ce que tu attends. Une solution générale coûte
assez chère, et n'est que rarement nécessaire. Alors, selon le
principe de ne pas payer pour ce dont tu ne te sers pas...
Un simple mutex standard pouvant être initialisé de façon statique et
atomique me convient.
Maintenant, si un nouveau keyword me permet d'assurer qu'une
initialisation static ne se fait qu'une fois ou même qu'une opération se
fait de façon atomique, c'est royal.
On Mar 14, 10:40 am, Michael DOUBEZ wrote:On Mar 13, 9:33 pm, Michael DOUBEZ wrote:
[...]
C'est assez proche du singleton. Pourquoi pas en faire une
véritable singleton :
C'est un singleton avec une fonction custom d'initalisation à cause
de l'initialisation statique des variables.
Je ne comprends pas trop. Est-ce que c'est un singleton ou
non ? Moi, ce que je voyais, c'est que le map se comporte comme
un singleton. La plus simple, alors, serait de le wrapper pour
faire l'initialisation, et ensuite, le gerer comme un singleton.
Je voulais garder le principe d'une static de class de l'OP sans
allocation par new.
C'est un singleton (de mon point de vue).
std::map<...>&
X::get()
{
static::map<...>* theOneAndOnly = createMap() ;
return *theOneAndOnly ;
}
avec :
std::map<...>*
createMap()
{
std::map<...>* result = new std::map<...> ;
// initialisation du map...
return result ;
}
Oui, c'est beaucoup plus clair et peut être avec un auto_ptr<> pour être
100% propre.
Au contraire. Tout l'intérêt de cette solution, c'est que
l'objet n'est jamais detruit. Ou surtout, si on préfère, qu'il
n'est pas détruit avant que quelqu'un s'en sert dans le
destructeur d'un autre objet statique.
Un programme/OS est garanti de rendre toutes les ressources a la
terminaison ?
Ça a aussi l'avantage d'éliminer les risques dues à l'ordre de
destruction. (J'avoue ne jamais avoir eu de problèmes de cette
côté-là, mais en principe, elles existent.)
Enfin, il faut faire gaffe aux threads dans ces cas-là. La
construction des statiques locales n'est pas thread safe, au
moins dans les compilateurs courants. Du coup, il faudrait soit
s'assurer que la fonction est appelée au moins une fois avant le
démarrage des threads, soit y introduire des locks.
J'attends avec impatience le prochain standard qui je l'espère appor tera
des solutions élégantes aux statiques partagées.
Je ne sais pas ce que tu attends. Une solution générale coûte
assez chère, et n'est que rarement nécessaire. Alors, selon le
principe de ne pas payer pour ce dont tu ne te sers pas...
Un simple mutex standard pouvant être initialisé de façon statique et
atomique me convient.
Maintenant, si un nouveau keyword me permet d'assurer qu'une
initialisation static ne se fait qu'une fois ou même qu'une opération se
fait de façon atomique, c'est royal.