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
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.
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).
- 1. Initialisation thread-safe des variables statiques
- 2. Initialisation des variables statiques de la fonction
- 3. Initialisation des variables BPEL
- 4. Initialisation des variables de tableau
- 5. Initialisation des membres statiques de l'objet
- 6. Ordre d'initialisation des variables statiques
- 7. java beginner: initialisation des variables de classe
- 8. iPhone - initialisation des variables en utilisant self
- 9. Initialisation de membres statiques d'une classe modélisée
- 10. variables et fonctions statiques
- 11. Variables statiques dans Android
- 12. C++ Initialisation des membres statiques (modèle amusant à l'intérieur)
- 13. Variables statiques C++ dynamiques
- 14. Variables statiques, compilation séparée
- 15. Variables statiques dans R
- 16. Asp.Net/C# persistance des variables statiques
- 17. aide avec des variables statiques en Java
- 18. Variables statiques privées pour établir des invariants
- 19. Variables statiques dans ASP.NET
- 20. variables statiques dans ruby
- 21. héritage n variables statiques
- 22. Java initialisation problème de l'ordre, les champs statiques vs exemple
- 23. C: Global, variables statiques compréhension
- 24. C# Initialisation des variables locales - Question du débutant
- 25. classe php variables statiques, concat
- 26. Variables statiques PHP entre guillemets
- 27. initialisation de variables dans les classes d'ActiveRecord
- 28. Initialisation de variables génériques dans Scala
- 29. Initialisation en classe de données statiques non-intégrées
- 30. Initialisation des paramètres du modèle
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. –