Comment getInstance ()?
Récent que j'ai lu un code C++ en utilisant largement suivantes méthode getInstance ():
class S
{
private:
int some_int = 0;
public:
static S& getInstance()
{
static S instance; / (*) /
return instance;
}
};
De la façon dont ce fragment de code utilisé, j'ai appris la getInstance() fonctionne comme return this
, de retourner l'adresse(ou une référence) de l'instance de class S
. Mais je n'ai pas compris.
1) où la variable statique S
défini dans la ligne(*) alloués en mémoire? Et pourquoi il peut fonctionner comme return this
?
2) s'il existe plus qu'une seule instance de class S
, dont la référence sera retourné?
OriginalL'auteur qweruiop | 2013-09-25
Vous devez vous connecter pour publier un commentaire.
C'est le soi-disant Singleton modèle de conception. Sa principale caractéristique est qu'il ne peut jamais être exactement une instance de la classe et le modèle assure que. La classe a un constructeur privé et d'une manière statique créé instance qui est retourné avec la
getInstance
méthode. Vous ne pouvez pas créer une instance de l'extérieur et donc faire l'objet uniquement par cette méthode.Depuis
instance
eststatic
dans legetInstance
méthode il conserve sa valeur entre de multiples appels. Il est alloué et construit quelque part avant sa première utilisation. E. g. dans cette réponse il semble que GCC initialise la variable statique à la fois la fonction est d'abord utilisé. Cette réponse a quelques extraits de la norme C++ lié à cela.OriginalL'auteur Joey
Variable statique avec une portée de fonction est attribué la première fois que la fonction est appelée. Le compilateur garde la trace du fait qu'elle est initialisé la première fois et évite la création lors de la prochaine visite à la fonction. Cette propriété serait idéale pour mettre en œuvre un le pattern singleton puisque cela nous permet simplement de maintenir une seule copie de l'objet. En plus des nouveaux compilateurs permet de s'assurer de cette allocation est également thread-safe donnant un bonus thread-safe singleton mise en œuvre sans l'aide d'aucune allocation dynamique de la mémoire. [Comme l'a souligné dans les commentaires, c'est le c++11 norme qui garantit la sécurité des threads afin de faire votre enregistrement sur fil de sécurité si vous utilisez un compilateur différent]
Il y a des régions spécifiques dans la mémoire où les variables statiques sont stockées, comme le tas pour allouée dynamiquement des variables et de la pile pour le moment de la compilation des variables définies. Il peut varier avec les compilateurs, mais pour GCC il y a des sections spécifiques appelé DATA et BSS segments dans le exécutable généré par le compilateur où initialisé et non initialisé les variables statiques sont stockées.
Comme mentionné sur le dessus, car il est une variable statique le compilateur s'assure il ne peut être une instance créée la première fois que la fonction est visité. Aussi, puisqu'il a le champ d'application dans la fonction qu'il ne peut pas en conflit avec les autres instances existant ailleurs et getInstance vous assure la même instance unique.
OriginalL'auteur jayadev