quest-ce quune classe dallocation? une classe dallocation détermine la portée et la durée de vie...
Post on 04-Apr-2015
111 Views
Preview:
TRANSCRIPT
Qu’est-ce qu’une classe d’allocation?
Une classe d’allocation détermine la portée et la durée de vie d’un objet ou d’une fonction.
Le nom « classe d’allocation » n’a aucun rapport avec la notion de classe de la programmation objet.
Petite remarque
C++
Qu’est-ce que la portée d’une variable ?
Toute variable en C est soit locale ou externe (globale).
Une variable possède une visibilité externe si elle est définie à l’extérieur d’une fonction.
Inversement, une variable est dite locale si elle est définie à l’intérieur d’une fonction.
Les variables de visibilité externe
Une variable externe possède la même durée de vie que le programme et est toujours définie dans la partie data segment de la mémoire du programme.
Une variable externe est visible par toutes les fonctions définies après la variable dans le même fichier que celle-ci.
Une variable externe peut être masquée par une variable locale à l’intérieur d’une fonction.
Par défaut, les fonctions sont externes.
Les variables de visibilité locale
La durée de vie d’une variable locale varie selon son emplacement en mémoire.
Une variable locale peut être allouée à trois endroits : les registres de l’UCT, la pile ou le data segment. Le programmeur doit lui-même spécifier le lieu d’allocation de la variable.
Une variable locale n’est visible que dans l’instruction composée (bloc) où elle a été définie.
Résumé des choix d’emplacement
Variable
Externe
Locale
Permanente (data segment)
Pile (stack)
Registres
Emplacement en mémoireVisibilité
Permanente (data segment)
Disposition en mémoire d’un programme
Mémoire vive de l’ordinateur Registres de l’UCT
Mémoire allouée au programme
Data segment
Code segment
Stack (pile d’exécution)
Heap (entrepôt à octets)
Contient les variables externes et
les chaînes de caractères littérales
Conserve les instructions du programme (en lecture seule)
Empile les appels de fonctions et les
variables locales
Endroit où s’effectuent les
allocations programmées de
mémoire
Conserve les données accessibles
très rapidement
Les 4 classes d’allocation du C
auto : Classe d’une variable locale placée dans la pile (stack).
register : Classe d’une variable locale placée dans un registre de l’UCT.
static : Classe d’une variable locale ou externe placée dans le data segment.
extern : Classe associée à toute variable de visibilité externe.
La classe d’allocation auto
Classe d’allocation par défaut des variables locales et des paramètres d’une fonction.
Une variable auto est allouée dans la pile. Une variable auto vit aussi longtemps que
l’instruction composée où elle à été définie. Exemple :
void exemple(void) { auto int i; /* Le mot auto est facultatif, puisque c’est la classe d’allocation par défaut. */ ...}
La classe d’allocation register
Exprime le souhait de placer une variable ou un paramètre dans un registre de l’UCT.
Une variable register vit aussi longtemps que l’instruction composée où elle à été définie.
Il est impossible d’appliquer l’opérateur & sur une variable de la classe d’allocation register.
Cette classe est désuète en raison de la capacité d’optimisation des compilateurs.
Exemple :
void exemple(void) { register int i; ...}
Classe d’allocation static
Une variable static est toujours allouée dans le data segment dès le départ du programme. Si elle n’est pas initialisée, le compilateur lui assigne la valeur 0.
Une variable static possède la même durée de vie que le programme.
Un paramètre d’une fonction ne peut pas appartenir à cette classe.
Une variable de la classe d’allocation static conserve son contenu entre les appels de l’instruction composée où elle est définie.
Exemple d’utilisation de la classe d’allocation static
Une variable static peut servir entre autres à : Connaître le nombre de fois qu’une fonction a été
appelée (et par le fait même si c’est la première fois) ;
Se souvenir d’un calcul effectué précédemment.
Exemple :void exemple(void){ static int indice_appel = 0;
++indice_appel; printf (« Cette fonction a été appelée %d » « fois.\n », indice_appel);}
Variables externes et fonctions de la classe d’allocation static
Le mot static permet de rendre confidentielle au fichier où elle est définie une fonction ou une variable externe.
Lorsqu’une fonction ou une variable est confidentielle, l’éditeur de lien n’arrive pas à la trouver. Elle devient donc inutilisable à l’extérieur du fichier où elle est définie.
On prendra l’habitude de toujours préfixer de static les variable externes et les fonctions dissimulées dans le .C d’une librairie.
La classe d’allocation extern
Une variable extern est toujours allouée dans le data segment dès le départ du programme. Si elle n’est pas initialisée, le compilateur lui assigne la valeur 0.
Une variable extern possède la même durée de vie que le programme.
C’est la classe d’allocation par défaut des variables externes et des fonctions, ce qui est logique puisque la définition d’une fonction ne peut être que de niveau 0.
Un paramètre ne peut pas appartenir à la classe d’allocation extern.
Exemple d’utilisation de la classe d’allocation extern
Sans qu’on le demande, tout système fournit des variables globales. Par exemple, errno et sys_errlist qui contiennent respectivement la valeur entière de la dernière erreur détectée et un accès au tableau des messages d’erreurs du système.
Pour les utiliser, il suffit d’ ajouter ceci à un programme :
extern int errno;
extern char* sys_errlist[];
Et où vont les malloc ?
Les allocations programmées (effectués à l’aide d’un malloc par exemple) s’effectuent dans l’entrepôt à octets (heap).
Elles n’ont pas de classe d’allocation et ne se libèrent qu’à la fin du programme ou encore lorsque le programmeur le demande.
Résumé
VARIABLE
VISIBILITÉ : LOCALE EXTERNE
EMPLACEMENT : REGISTRE
(register)
PILE
(auto)
PERMANENTE
(static)
PERMANENTE
(extern)
Pour plus d’informations, consultez
Philippe Drix, Le langage C ANSI 3ème édition, chapitre IX
Merci au
Service des Enseignements Généraux
et à
Hugues SaulnierFIN
top related