2010-10-09 11 views
4

Je viens de lire que si je veux être sûr de l'ordre d'initialisation, il vaudra mieux utiliser une fonction qui va transformer la variable globale en locale (mais toujours statique), ma question, dois-je besoin de garder un identifiant qui me dit que mon objet statique a déjà été créé (l'identifiant à l'intérieur de la fonction qui m'empêche de l'initialisation du static object une fois de plus) ou non? parce que je peux utiliser cette fonction avec initialisation dans différents endroits, merci d'avance pour toute aideinitialisation des variables statiques

Répondre

0

En ce qui concerne la norme concerne, l'initialisation d'une fonction portée variable statique se produit qu'une seule fois:

int *gettheint(bool set_to_four) { 
    static int foo = 3; // only happens once, ever 
    if (set_to_four) { 
     foo = 4; // happens as many times as the function is called with true 
    } 
    return &foo; 
} 

Alors il n'est pas nécessaire de gettheint pour vérifier si foo a déjà été initialisé - la valeur ne sera pas remplacée par 3 lors du second appel et des suivants.

Les filetages jettent une clé dans les travaux, étant en dehors de la portée de la norme. Vous pouvez vérifier la documentation de votre implémentation de threads, mais il y a de fortes chances que l'implémentation unique de l'initialisation ne soit pas adaptée aux threads dans votre implémentation. C'est ce que pthread_once est pour, ou équivalent. Alternativement dans un programme multi-thread, vous pouvez appeler la fonction avant de créer des threads supplémentaires.

+0

Comme il ne l'a pas mentionné, je dirais que le problème de threading est de 50/50 car la plupart des gens sont soit windows soit gcc. Seuls les courageux et les forcés ou les gens qui savent ce qu'ils font sont plus courageux que cela de nos jours. Puisque le problème est couvert par gcc, seuls les utilisateurs du studio de développement ont un problème. –

1

La première question est de savoir si vos objets de durée de vie statique sont soucieux de l'ordre dans lequel ils sont initialisés?

Si c'est vrai, la deuxième question est pourquoi?

L'initialisation est seulement un problème si un objet global utilise un autre objet global lors de son initialisation (c'est-à-dire lorsque le constructeur est en cours d'exécution). Note: Ceci est horrible proactif et devrait être évité (les globals ne devraient pas être utilisés et s'ils sont ils devraient être interdépendants).

Si elles doivent être liées, elles doivent être liées (dans ce cas, vous pouvez potentiellement créer un nouvel objet incluant les deux anciennes afin de contrôler plus précisément leur création). Si ce n'est pas possible, il suffit de les placer dans la même unité de compilation (lire le fichier * .cpp).

Questions connexes