Pour comprendre pourquoi la variable de la taille des tableaux sont plus compliquées à mettre en œuvre, vous avez besoin de savoir un peu comment automatique de la durée de stockage ("local") variables sont généralement mises en œuvre.
Les variables locales ont tendance à être stockées sur l'exécution de la pile. La pile est en fait un large éventail de la mémoire, qui est séquentiel attribué aux variables locales et de l'index pointant vers le présent "high water mark". Cet indice est le pointeur de pile.
Lorsqu'une fonction est entré, le pointeur de pile est déplacé dans une direction pour allouer de la mémoire sur la pile pour les variables locales; lorsque la fonction se termine, le pointeur de pile est déplacé dans l'autre sens, à libérer les.
Cela signifie que l'emplacement réel de variables locales dans la mémoire est définie uniquement par référence à la valeur du pointeur de pile à l'entrée de la fonction1. Le code dans une fonction, on doit accéder à des variables locales par le biais d'un décalage à partir du pointeur de pile. L'exacte des compensations à être utilisés dépendent de la taille des variables locales.
Maintenant, lorsque toutes les variables locales ont une taille fixe au moment de la compilation, ces décalages du pointeur de pile sont également fixe, de sorte qu'ils peuvent être codées directement dans les instructions que le compilateur émet. Par exemple, dans cette fonction:
void foo(void)
{
int a;
char b[10];
int c;
a
peut être accessible en tant que STACK_POINTER + 0
, b
peut être accessible en tant que STACK_POINTER + 4
, et c
peut être accessible en tant que STACK_POINTER + 14
.
Cependant, lors de l'introduction d'une variable tableau de taille, ces décalages peuvent plus être calculée au moment de la compilation; certains d'entre eux vont varier en fonction de la taille de la matrice a sur cette invocation de la fonction. Cela rend les choses beaucoup plus compliquées pour les rédacteurs du compilateur, car il faut maintenant écrire le code qui accède STACK_POINTER + N
- et depuis N
varie lui-même, il doit également être stocké quelque part. Souvent, cela signifie faire deux accès - l'un à l' STACK_POINTER + <constant>
à la charge N
, puis une autre pour la charge ou le magasin le locale réelle de la variable d'intérêt.
1. En fait, "la valeur du pointeur de pile à l'entrée de la fonction" est une valeur d'utilité d'avoir autour, qu'il a un nom qui lui est propre - le pointeur de l'image - et de nombreux Processeurs de fournir un registre distinct dédié à stocker le pointeur de cadre. Dans la pratique, il est généralement le pointeur de l'image à partir de laquelle l'emplacement des variables locales est calculé, plutôt que le pointeur de pile elle-même.