Comment puis-je créer le mondial, mutable singleton?
Quelle est la meilleure façon de créer et d'utiliser une structure avec une seule instanciation dans le système? Oui, c'est nécessaire, c'est de l'OpenGL sous-système et de faire plusieurs copies de ce et de le transmettre autour de partout serait ajouter de la confusion, plutôt que de la soulager.
Le singleton doit être aussi efficace que possible. Il ne semble pas possible de stocker un objet arbitraire sur la zone statique, car il contient un Vec
avec un destructeur. La deuxième option consiste à stocker un (dangereux) pointeur sur la zone statique, pointant vers un segment de mémoire allouée singleton. Quelle est la plus commode et la plus sûre façon de le faire, tout en gardant la syntaxe laconique.
- Avez-vous regardé comment la Rouille existante liaisons pour OpenGL gérer ce même problème?
- Oui, c'est nécessaire, c'est de l'OpenGL sous-système et de faire plusieurs copies de ce et de le transmettre autour de partout serait ajouter de la confusion, plutôt que de la soulager. => ce n'est pas la définition du besoin, il est peut-être pratique (au premier abord), mais pas nécessaire.
- Oui, vous avez un point. Bien que depuis OpenGL est une grosse machine de l'etat, de toute façon, je suis proche de certains il n'y aura pas un clone de nulle part, dont l'utilisation ne pourrait résulter en OpenGL erreurs.
Vous devez vous connecter pour publier un commentaire.
Non-réponse réponse
Éviter global de l'état en général. Au lieu de cela, construire l'objet quelque part au début (peut-être dans
main
), puis passer mutable les références à cet objet dans les lieux qui en ont besoin. Il s'agit généralement de rendre votre code plus facile à comprendre et ne nécessite pas autant de pencher en arrière.Regard dur à vous-même dans le miroir avant de décider que vous voulez mondiale mutable variables. Il existe de rares cas où c'est utile, c'est pourquoi il est bon de savoir comment le faire.
Encore envie de faire une...?
À l'aide de paresseux-statique
La paresseux-statique caisse peut enlever un peu de la corvée de la création d'un singleton (ci-dessous). Voici un mondial mutable vecteur:
Si vous supprimez le
Mutex
alors vous avez un mondial singleton sans mutabilité.Un cas particulier: les atomics
Si vous avez seulement besoin de suivre un entier de valeur, vous pouvez utiliser directement un atomique:
Manuel, dépendance-gratuit de mise en œuvre
C'est grandement chipé par la Rouille 1.0 mise en œuvre de
stdin
. Vous devriez aussi regarder à la moderne, la mise en œuvre deio::Lazy
. J'ai commenté en ligne avec ce que chaque ligne ne.Cette affiche:
Ce code compile avec de la Rouille 1.23.0. Le réel implémentations de
Stdin
utiliser certaines fonctionnalités instables pour tenter de libérer la mémoire allouée, que le présent code ne fonctionne pas.Vraiment, vous auriez probablement souhaitez faire
SingletonReader
mettre en œuvreDeref
etDerefMut
si vous n'avez pas à fouiner dans l'objet et de la serrure elle-même.Ensemble de ce travail est que paresseux-statique fait pour vous.
Le sens de "global"
Veuillez noter que vous pouvez toujours utiliser la normale de la Rouille détermination de la portée et au niveau du module de confidentialité pour contrôler l'accès à un
static
oulazy_static
variable. Cela signifie que vous pouvez déclarer dans un module ou même à l'intérieur d'une fonction et il ne sera pas accessible de l'extérieur de ce module ou une fonction. C'est bon pour le contrôle de l'accès:Cependant, la variable est toujours global qu'il n'y a qu'une seule instance de ce qui existe à travers l'ensemble du programme.
void *
qui est ensuite passé dans chaque module de méthodes. C'est typique de l'extension de modèle pour du code C. Si l'application ne permettent pas cela et vous ne pouvez pas le changer, alors oui, un singleton peut être une bonne solution.Avoid global state in general
mais l'état global est une chose et la nécessité de la représentation. Et le code pourexternal static
est imparfait et ne compile pas sur rustc 1.24.1lazy_static
exemple dans la Rouille 1.24.1 et il fonctionne exactement. Il n'y a pasexternal static
partout ici. Peut-être vous avez besoin de vérifier les choses de votre côté pour vous assurer que vous avez compris la réponse pleinement.stdin
. Il sembleptr::null
seulement devenuconst
en 1.4.0.Manual, dependency-free implementation
, comment vous y prendriez-vous l'écriture de tests de code qui utilise cette instance du singleton? puisque chaque test est exécuté dans son propre thread, et l'état est partagée, elle complique les tests de droite?