2008-11-27 11 views
5

Je voudrais connaître la différence entre les variables statiques et les variables globales en termes de la vitesse d'accès et la consommation d'espace. (Si vous voulez connaître ma plate-forme: compilateur gcc sous Windows.) (J'utilise Cygwin avec Triton IDE pour la programmation embarquée ARM7 sous Windows.) Triton est livré avec un compilateur gcc sur plate-forme Java.)Statique vs globale en termes de vitesse et de consommation d'espace en C

(Évidemment je sais en termes de portée de dossier et de fonction de this question)

Éditez: OK donnez-moi une réponse sur n'importe quel environnement de microcontrôleur/processeur.

Répondre

10

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

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

Bien sûr, l'accès mémoire à la variable est global et statique. Mais le compilateur peut optimiser quand vous avez statique. Quand il compile un module, il sait qu'aucun appel de fonction à une fonction en dehors du module ne peut changer une variable statique. Donc, il sait exactement ce qui se passe et peut, par exemple, Gardez-le dans un registre sur les appels de fonction. Quand il est global et que vous appelez une fonction d'un module différent, le compilateur ne peut pas savoir ce qu'il fait. Il doit donc supposer que la fonction accède à la variable et la modifie, ce qui entraîne un stockage et un rechargement. Avec gcc vous pouvez passer toutes les sources .c en même temps, ainsi il peut également voir ce qui se passe dans les appels de fonction à des fonctions de différents modules.

Avec gcc vous pouvez passer toutes les sources .c en même temps. Pour le faire fonctionner, vous devez passer à côté de tous les fichiers .c à la fois -combine et -fwhole-program. Le -fwhole-program rend toutes les variables globales statiques (pas le module statique mais l'unité de compilation statique, c'est-à-dire tous les fichiers .c donnés ensemble). Le -combine effectue l'analyse intermodule.

1

Consommation d'espace: essentiellement pas de différence. La seule fois où il y a un problème d'espace, c'est que si vous réussissez à obtenir le même bloc de données statiques cachées dans N fichiers objets, vous obtenez un facteur de multiplication de N où vous pourriez avoir une seule copie s'il s'agissait d'une seule pièce globale de données. Cependant, c'est un problème de conception erronée. La dissimulation d'informations est bonne - à moins que l'information ne soit cachée.

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

1

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

+0

En regardant l'ensemble produit par le compilateur serait également révélateur. –

1

Je m'attendrais à ce que toute différence provienne des problèmes d'emballage (pour l'espace) et de mise en cache (pour la vitesse). Les deux pourraient également provenir de n'importe quoi d'autre.

0

Il n'y a aucune différence dans l'env vous décrivez quand il s'agit de espace. La variable statique ou globale consomme juste la même quantité de mémoire.

Pour vitesse considérations (mais pas une bonne pratique), vous pouvez préférer vars global, si vous avez besoin d'accéder au var en dehors du seul fichier.

Pour une meilleure utilisation, utilisez plutôt les fonctions get/set, mais elles sont plus lentes. Donc, vous pouvez utiliser des macros pour obtenir/définir un var qui est global pour cacher au lecteur du code que le var est en fait global, mais c'est un peu comme tricher. Mais cela peut rendre le code plus lisible.

Si vous comparez cacher une var dans une fonction, alors il n'y a aucune différence par rapport à la placer en dehors de la fonction et plus de fonctions pourraient avoir accès à la var.

Je me sers MSP430, ARM7 (juste pour les tests) et AVR32 pour le développement micro-ordinateurs

+0

Merci Jonathan Leffler – eaanon01

0

Ce que Jonathan dit 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 "le garder" sur le registre strictement - ce qu'il pourrait faire est de charger la valeur dans le registre, utiliser ce registre pour toutes les opérations et sauvegarder cette valeur en arrière - c'est une optimisation spécifique au compilateur. Et même alors, il n'y a aucune raison pour que le compilateur ne le fasse pas non plus pour les variables globales: à moins bien sûr que vous le rendiez volatile. Mais alors, techniquement, vous pouvez également faire une variable statique volatile, donc encore aucune différence.

Editer: oh ouais - espace: pas de différence.