19

Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

Embed Size (px)

Citation preview

Page 1: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction
Page 2: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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.

Page 3: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

Le nom « classe d’allocation » n’a aucun rapport avec la notion de classe de la programmation objet.

Petite remarque

C++

Page 4: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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.

Page 5: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune 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.

Page 6: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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.

Page 7: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

Résumé des choix d’emplacement

Variable

Externe

Locale

Permanente (data segment)

Pile (stack)

Registres

Emplacement en mémoireVisibilité

Permanente (data segment)

Page 8: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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

Page 9: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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.

Page 10: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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. */ ...}

Page 11: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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; ...}

Page 12: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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.

Page 13: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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);}

Page 14: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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.

Page 15: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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.

Page 16: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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[];

Page 17: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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.

Page 18: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

Résumé

VARIABLE

VISIBILITÉ : LOCALE EXTERNE

EMPLACEMENT : REGISTRE

(register)

PILE

(auto)

PERMANENTE

(static)

PERMANENTE

(extern)

Page 19: Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction

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