Developpez.com - Pascal
X

Choisissez d'abord la catégorieensuite la rubrique :

 

CHAPITRE XXIII : Gestion de la mémoire par l'exécutable

Par Hugo ETIEVANT

  1. Limite virtuelle de la mémoire.
  2. Passage d'un paramètre à un sous-programme.
 

1. Limite virtuelle de la mémoire.

Une fois compilé (commande Run, Compile ou Make), un programme gère la mémoire très rigoureusement. Le tableau ci-dessous vous montre que les variables principales, les variables locales des sous-programmes et les pointeurs ne sont pas stockés dans les mêmes parties de la mémoire. En effet, les variables principales de font la part belle, la mémoire allouée aux pointeurs (très gourmands en mémoire) est variable et celle destinée aux variables locales est assez restreinte.

 Pile (Stack)
16 ko par défaut
Destiné aux variables locales des sous-programmes (procédures, fonctions) ainsi qu'aux valeurs passées par valeur aux sous-programmes.
 Tas (Heap)
de 0 à 640 ko
Réservé aux pointeurs.
 Segment de données
64 ko
Destiné aux variables du programme principal.

Explications : les sous-programmes étant destinés à des calculs intermédiaires, ils n'ont guère besoins d'ébnormément de ressource mémoire. Quand aux pointeurs que l'on verra dans les chapitres suivant, ils sont destinés à la manipulation d'une grande quantité de données.

Mais il est toutefois possible de modifier manuellement une telle organisation de la mémoire afin, par exemple, de privilégier la Pile grâce au commentaire de compilation suivant : {$M n1, n2, n3}. Ce type de commentaire est destiné au compilateur Borland Pascal qui inscrira les informations spécifiées dans le programme compilé. Un commentaire de compilation se présente entre accolades comme n'importe quel autre commentaire, mais un signe dollar "$" signifie qu'il est destiné au compilateur. Quand au "M" il dit au compilateur qu'on souhaite réorganiser la disposition de la mémoire à l'aide des valeurs n1, n2 et n3 qui spécifient respectivement la taille en kilo octets de la Pile (doit être inférieur à 64 ko), la taille minimale et la taille maximale (inférieur à 640 ko) du Tas.

Mais pourquoi s'enquiquiner avec ça ? Tout simplement parce qu'il pourra vous arriver d'avoir insuffisament de mémoire à cause d'un tableau trop long par exemple. Si vous déclarer une telle variable dans une prodédure :

Var tableau : Array[1..50, 1..100] Of Real ;
vous obtiendrez le message d'erreur n°22 : Structure too large qui veut dire que votre variable tient trop de place pour être stockée dans la mémoire allouée. Car en effet, ce tableau tient : 50 * 100 * 6 octets = 29 ko ( 1 ko = 2^10 = 1024 octets) 29 ko > 16 ko donc le compilateur renvoit une erreur. Et le seul moyen qui vous reste est de modifier les valeurs correspondantes aux grandeurs allouées à la Pile par un commentaire de compilation ou en allant dans le menu Option/Memory Size. D'où l'intérêt du Chapitre 4 ("Différents types de variables") qui vous indique la taille de chaque type de variable.  

2. Passage d'un paramètre à un sous-programme.

Dans le Chapitre 7 ("Procédures et sous-programmes") vous avez appris qu'on pouvait passer un paramètre par valeur ou bien par adresse à une procédure paramétrée. Vous avez également compris l'intérêt de la syntaxe Var dans la déclaration d'une prodédure. Quand un sous-programme est appelé, le programme compilé réalise en mémoire (dans la Pile) une copie de chaque argument passé au sous-programme. Ces copies ne sont que temporaires puisque destinées au fonctionnement de sous-programmes qui n'interviennent que temporairement dans le programme. Ainsi un changement de valeur au sein de la procédure d'un paramètre passé par adresse sans la syntaxe Var n'est pas répercuté dans le programme principale. Alors que dans le cas de la présence de la syntaxe Var, le programme ne duplique pas la valeur ainsi passée à la procédure dans la Pile, mais le paramètre du sous-programme et la variable principale (passée comme argument à la procédure) sont joints vers la zone de la mémoire de la variable principale (dans la partie Segment de données). Ainsi toute variation interne à la procédure est répercuté directement sur l'argument (la variable du programme principal passé en parmètre).

Responsables bénévoles de la rubrique Pascal : Gilles Vasseur - Alcatîz -