12
votes

Existe-t-il une bonne raison d'initialiser une variable statique sur chaque appel à la fonction où elle est définie?

Un collègue fait un examen du code et il constate de nombreuses déclarations de variable statiques similaires à celles suivantes:

void someFunc(){

   static int foo;
   static int bar;
   static int baz;

   foo = 0;
   bar = 0;
   baz = 0;

   /* 
       rest of the function code goes here
   */

}

c

2 commentaires

Lorsque vous déclarez statique, il évite de stocker la variable dans la pile. Ainsi, minimiser la taille de la pile pourrait également être une raison ..


S'ils l'ont fait exprès, par exemple, de réduire l'utilisation des piles, ils auraient dû expliquer que dans un commentaire.


4 Réponses :


13
votes

Si ce n'était pas un système intégré, vous seriez probablement correct: je parierais que les programmeurs n'étaient pas clairs sur le concept de la statique et devaient avoir pour but d'écrire ceci: xxx

Cependant, dans un système intégré, ils auraient pu utiliser statique pour éviter d'attribuer les variables dans le stockage automatique (c'est-à-dire sur la pile). Cela pourrait enregistrer quelques cycles de CPU, car l'adresse de la variable statique serait "cuite à" le code binaire de la méthode compilée.


4 commentaires

Cela permet également d'économiser des espaces de pile, que je pense est probablement le point le plus important. Il enregistrera l'ensemble de la mémoire, si la fonction est récursive (bien que cela rendra à l'aide de variables statiques difficiles). Si la taille de la pile est très limitée, il peut être nécessaire d'éviter un débordement de pile.


@morningstar Un très bon commentaire à une très bonne réponse à une très bonne question.


Appels de fonction récursive à l'aide de variables statiques ?! Il y avait mieux d'être une très bonne raison


Un compteur d'itération peut être une utilisation pour une variable statique dans une fonction récursive.



2
votes

Dans ce contexte, la mémoire statique n'est attribuée qu'une seule fois. Le problème avec ce code est l'initialisation. S'il est réinitialisé à chaque exécution, ces variables devraient exister sur la pile.


0 commentaires

0
votes

Mise en œuvre de la fonction tel qu'il est, sape les avantages statiques . Les 2 principales raisons d'utiliser statique sont:

  1. avoir une variable qui maintient la valeur entre les appels vers la même fonction
  2. Évitez d'attribuer la mémoire sur la pile

    @dasblinkenlight La réponse concerne la 2e option, mais il n'y a personne dans la programmation intégrée qui gaspillerait une mémoire irrécupérable afin de sauvegarder 24 octets (en supposant que int est de 32 octets sur votre architecture) sur le empiler. La raison en est que le compilateur va manipuler le pointeur de la pile entrant à la fonction indépendamment, et donc il n'y a rien à sauver (en termes de cycles) de ne pas le faire pousser les 24 autres octets.

    Garder cela à l'esprit, nous nous trouvons avec l'option que l'utilisateur souhaitait conserver certaines informations concernant FOO , bar et baz entre appels. Si ce n'est pas non plus le cas, ce que vous regardez est une mauvaise programmation.


2 commentaires

Bien que le compromis entre la pile et le segment de données aient peu de sens dans la plupart des micros 32 bits, il pourrait avoir un sens dans une analyse de ressources très limitée telle que de nombreux processeurs PIC ou AVR. Les plus petites photos ont une pile d'appels matériels très superficiels et seulement quelques centaines d'octets de RAM total. Bien sûr, la plupart des codes pour cet environnement limité utilisent simplement des variables globales. Il existe même des noyaux de bras dans le système sur un emballages à puce avec un très petit RAM (et un nombre de broches) également.


@Levengli je suppose que vous voulez dire 32 bits, pas 32 octets?



0
votes

Avantages statiques. sont:

avoir une variable qui maintient la valeur entre les appels vers la même fonction Évitez d'attribuer la mémoire sur la pile


0 commentaires