Durée

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Déclarations - Index

La durée de vie, en relation étroite avec la classe de stockage, définit la période pendant laquelle les identificateurs déclarés ont des objets physiques réels affectés en mémoire. Nous faisons également une distinction entre les objets établis pendant la compilation et ceux qui l'ont été pendant l'exécution. Les variables, par exemple, à l'inverse des types et des typedef, ont une affectation réelle en mémoire durant l'exécution. Il existe trois types de durée de vie : statique, locale et dynamique.

Statique

Les objets ayant une durée de vie statique ont une allocation mémoire dès le début de l'exécution ; cette allocation de mémoire dure jusqu'à la fin du programme. Toutes les fonctions, lorsqu'elles sont définies, ont des objets à durée statique. Toutes les variables à portée fichier ont une durée statique. D'autres variables peuvent avoir une durée statique si vous utilisez les spécificateurs de classe de stockage explicites static ou extern.

Les objets à durée de vie statique sont initialisés à zéro (ou à NULL) en l'absence de toute valeur d'initialisation explicite ou, dans C++, de constructeur de classe.

Il ne faut pas confondre la durée de vie statique avec la portée fichier, ou portée globale. Un objet peut avoir une durée de vie statique et une portée locale.

Locale

Les objets à durée de vie locale, également appelés objets automatiques, ont une existence plus précaire. Ils sont créés dans une pile (ou un registre) lorsque le bloc englobant ou la fonction commence à s'exécuter. Une fois que le programme quitte ce bloc ou cette fonction, ils sont désalloués. Les objets à durée de vie locale doivent être initialisés de façon explicite ; sinon, leur contenu n'est pas prévisible. Ils doivent toujours avoir une portée locale ou une portée fonction. Il est possible d'utiliser le spécificateur de classe de stockage auto au moment de la déclaration des variables de durée locale, mais cette démarche est généralement redondante car auto est la valeur par défaut des variables déclarées dans un bloc. Un objet à durée de vie locale a également une portée locale puisqu'il n'existe pas en dehors de son bloc englobant. La réciproque n'est pas vraie : un objet de portée locale peut avoir une durée de vie statique.

Lors de la déclaration de variables (par exemple, int, char, float), le spécificateur de classe de stockage register sous-entend également auto ; mais une demande est transmise au compilateur pour qu'un registre soit, si possible, alloué à l'objet. Le compilateur permet l'allocation d'un registre à une variable locale entière ou pointeur. Si aucun registre n'est disponible, la variable est définie comme un objet local, de type auto, sans qu'aucun avertissement ni message d'erreur ne soit émis.

Remarque :  Le compilateur peut ignorer les demandes d'allocation de registre. L'allocation de registre est basée sur l'analyse, par le compilateur, du mode d'utilisation d'une variable.

Dynamique

Les objets à durée de vie dynamique sont créés et détruits par des appels de fonctions spécifiques au cours de l'exécution. Ils sont définis dans une zone réservée de la mémoire appelée tas, soit à partir de fonctions de bibliothèque standard comme malloc, soit par l'intermédiaire de l'opérateur C++ new. Pour les désallocations correspondantes, free ou delete est utilisée.

Voir aussi