Question

J'aimerais connaître la différence entre les variables statiques et les variables globales en termes de vitesse d'accès et de consommation d'espace . (Si vous voulez connaître ma plate-forme: compilateur gcc sous Windows (J'utilise Cygwin avec la programmation intégrée Triton IDE for ARM7 sous Windows. Triton est livré avec un compilateur gcc sur une plate-forme Java qui peut être exécuté sous Windows.)

(Évidemment, je connais la portée des fichiers et des fonctions de cette question )

Modifier: OK, donnez-moi une réponse pour tous les environnements de microcontrôleur / processeur.

Était-ce utile?

La solution

Il n'y a pas de différence pour l'espace, ils prennent le même montant.

Mais il y a une différence de vitesse: l'électricité statique est plus rapide.

Bien sûr, l’accès mémoire à la variable est identique pour les variables globale et statique. Mais le compilateur peut optimiser lorsque vous avez statique. Lorsqu'il compile un module, il sait qu'aucun appel de fonction à une fonction extérieure au module ne peut modifier une variable statique. Donc, il sait exactement ce qui se passe et peut par exemple conservez-le dans un registre sur les appels de fonction. Lorsqu'il est global et que vous appelez une fonction depuis un module différent, le compilateur ne peut pas savoir ce qu'il fait. Par conséquent, il doit supposer que la fonction accède à la variable et la modifie, ce qui entraîne un stockage et un rechargement.

Avec gcc, vous pouvez transmettre toutes les sources .c en même temps, afin qu'il puisse également voir ce qui se passe dans les appels de fonction à des fonctions de modules différents. Pour que cela fonctionne, vous devez passer tous les fichiers .c à la fois -combine et -fwhole-programme . Le -fwhole-program rend tous les globals statiques (non pas le module statique, mais l'unité de compilation statique, c'est-à-dire tous les fichiers .c donnés). La -combine effectue l'analyse intermodule.

Autres conseils

Consommation d'espace: pratiquement aucune différence. Le seul cas où il y aurait un problème d'espace est que si vous parvenez à obtenir le même bloc de données statiques masqué dans N fichiers objet, vous obtenez alors un facteur de multiplication de N où vous pourriez ne disposer que d'une copie s'il s'agissait d'une seule pièce globale. de données. Cependant, c'est un problème de conception erronée. Cacher des informations est une bonne chose - à moins que ces informations ne soient pas cachées.

Vitesse d'accès: pas de différence.

C'est difficile à deviner ou à estimer. Cela prendrait probablement du temps, mais je ferais un exemple de projet et testerais sa rapidité. Tester à la fois la vitesse d'accès et l'espace avec une boucle. Testez le projet exemple avec un émulateur pour cette architecture.

Je m'attendrais à ce que toute différence vienne des problèmes d'emballage (pour l'espace) et de mise en cache (pour la vitesse). Ces deux éléments pourraient également provenir de presque tout autre chose.

Il n’existe aucune différence dans l’environnement que vous décrivez en matière de espace . Les variables statiques ou globales consomment exactement la même quantité de mémoire.

Pour des raisons de rapidité ( mais pas une bonne pratique ), vous pouvez préférer les vars globaux , si vous avez besoin d'accéder à la var en dehors du fichier . (réf. utilisation du caractère externe my_global_char_placed_else_where; )

Pour une meilleure pratique, utilisez plutôt les fonctions get / set, mais elles sont plus lentes. Vous pouvez donc utiliser des macros pour obtenir / définir une variable globale à masquer au lecteur du code indiquant que la variable virtuelle est globale, mais c'est un peu comme tricher. Mais cela peut rendre le code plus lisible.

Si vous comparez le masquage d'une variable var à l'intérieur d'une fonction, cela n'a aucune différence par rapport au fait de la placer en dehors de la fonction et plusieurs fonctions pourraient avoir accès à la variable.

J'utilise moi-même les microphones MSP430, ARM7 (juste pour les tests) et AVR32 pour le développement

Ce que dit Jonathan n’est pas tout à fait correct. Les variables statiques et globales seront (doivent être) sauvegardées dans les régions ZI (ou RW). Le compilateur ne peut pas " garder " strictement sur le registre - il peut charger la valeur dans le registre, utiliser ce registre pour toutes les opérations et sauvegarder cette valeur - une optimisation spécifique au compilateur. Et même dans ce cas, il n'y a aucune raison pour que le compilateur ne le fasse pas aussi pour les variables globales: à moins bien sûr que vous ne le rendiez volatile. Mais techniquement, vous pouvez également rendre une variable statique volatile, donc encore une fois, aucune différence.

Edit: oh yeah - espace: pas de différence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top