C - static
- il y a 1 jour
- 2 min de lecture
staticSavez-vous ce qui se cache réellement derrière ce mot ?
En programmation, on arrive vite au sujet d’allocation mémoire.
J’avais déjà écrit un article sur le Linker à ce sujet ;)
Nous allons aborder ici l’organisation de la RAM.
Selon l’endroit où est stockée une variable, celle-ci peut avoir une adresse changeante (en stack ou en heap) ou fixe.
Dans la stack, une variable est empilée le temps de l’exécution d’une fonction puis potentiellement réécrasée lors de l’exécution d’une autre fonction. On y retrouve ici les variables locales à usage temporaire (variable de boucle, calcul intermédiaire…) qui n’ont pas vocation à rester.
Dans le heap, c’est une allocation dynamique. Lorsque la taille de la variable n’est connue qu’à l’exécution (et non à la compilation), c’est cette zone qui est remplie. Afin d’éviter tout débordement, celle-ci a une taille limitée et définie par le linker script. Une fois la demande d’allocation acceptée, l’emplacement est réservé jusqu’à une libération explicite par le programme. Cela permet d’avoir une variable facilement partageable le temps de sa validité.
Pour le reste, chaque variable se voit allouer une adresse fixe ou “statique”. C’est pour cette raison que son contenu ne se voit pas modifié lors des appels successifs.
Le mot-clé static peut s’ajouter sur n’importe quelle variable. Y compris les variables locales qui auraient été allouées en pile par défaut par le compilateur. En leur allouant une adresse fixe, leur valeur n’est plus modifiée en sortant de la fonction ou plus précisément du contexte dans lequel elle est déclarée (une boucle for, un if…)
Ce mot-clé peut aussi s’ajouter aux variables globales (définies en dehors de toute fonction). L’intérêt ici est de restreindre la portée à l’unité de compilation.
De même, on peut rajouter static devant une définition de fonction afin, là encore, de limiter sa portée au module.
Pour conclure, static a 2 utilités :
Réserver une adresse fixe à une variable pour toute la durée d’exécution du programme
Tout en limitant la portée de la variable / fonction dans le scope dans lequel celle-ci est instanciée.
Maintenant, vous savez 🙂




