Quelque chose à votre esprit d'ébullition:
template <typename T>
struct Question
{
int& GetCounter() { static int M; return M; }
};
Et dans ce cas, combien de compteurs?
.
.
.
.
La réponse est: comme beaucoup de différents T
pour lesquels Question
est instancié avec, qui est un template
est pas une classe elle-même, mais Question<int>
est une classe, différente de Question<double>
donc chacun d'eux a un compteur différent. Fondamentalement, comme cela a été dit, une statique locale est propre à une fonction/méthode. Il y en a une pour la méthode, et deux méthodes différentes auront deux statiques locales différentes (si elles en ont).
struct Other
{
int& Foo() { static int M; return M; }
int& Bar() { static int M; return M; }
};
Ici, il y a 2 compteurs (au total): l'une est Other::Foo()::M
et l'autre est Other::Bar()::M
(noms pour plus de commodité seulement).
Le fait qu'il ya une classe est accessoire:
namespace Wazza
{
int& Foo() { static int M; return M; }
int& Bar() { static int M; return M; }
}
Deux autres compteurs: Wazza::Foo()::M
et Wazza::Bar()::M
.
Remarque évidente: une variable statique est, à toutes fins utiles, une variable globale, avec tous les problèmes qu'elle engendre, parmi lesquels: pas de réentrée possible (test plus difficile), obligation de sérialiser les accès en code multithread (goulot d'étranglement des performances), ... Essayez de ne pas utiliser de variables globales (et donc de singletons) autant que possible. –