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
*/
}
4 Réponses :
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: Cependant, dans un système intégré, ils auraient pu utiliser statique code> 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. P> p>
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.
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. P>
Mise en œuvre de la fonction tel qu'il est, sape les avantages code> statiques code>. Les 2 principales raisons d'utiliser @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 Garder cela à l'esprit, nous nous trouvons avec l'option que l'utilisateur souhaitait conserver certaines informations concernant statique code> sont: p>
int code> 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. P>
FOO code>, bar code> et baz code> entre appels. Si ce n'est pas non plus le cas, ce que vous regardez est une mauvaise programmation. P>
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?
Avantages statiques. sont: p>
avoir une variable qui maintient la valeur entre les appels vers la même fonction Évitez d'attribuer la mémoire sur la pile p>
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.