¿Cómo resuelve el comstackdor la dirección de la variable declarada después de una matriz de longitud variable?

Supongamos que tengo la siguiente función, que hace uso de una matriz de longitud variable:

void func(int size) { int var1; int arr[size]; int var2; ... } 

¿Cómo determina el comstackdor la dirección de var2 ?

La única forma en que puedo pensar es colocando arr después de var1 y var2 .

Pero en ese caso, ¿qué pasaría si hubiera varias matrices de longitud variable?

Colocarlos todos después de las variables “normales” solo ayudaría a resolver la dirección de la primera.

Mi suposición implícita aquí es que todas las variables locales (incluidos los VLA) están asignadas en la stack.

Me doy cuenta de que no está definido por el estándar C99, por lo que la pregunta es en esencia acerca de la comstackción.

Aquí hay un posible modelo. Piense en arr como un puntero (de tamaño fijo) a una matriz asignada a la stack:

 int var1; int *arr = alloca(sizeof(int) * size); int var2; 

Observe cómo la ubicación (relativa) de las tres variables no cambia con el size . Este modelo se generaliza fácilmente a múltiples VLAs.

Tenga en cuenta que esto es sólo un ejemplo. Cada comstackdor es libre de implementar VLAs como le plazca. Si desea saber qué hace su comstackdor, mire el código de ensamblaje generado.

Paso 1: para cada elemento de tamaño variable, cree una variable oculta que contenga un puntero a la matriz y una variable oculta que contenga el tamaño de la matriz. Estos pueden optimizarse, asignarse a registros, etc. como cualquier otra variable.

Paso 2: Asigne espacio para elementos de tamaño no variable de la manera normal.

Paso 3: Para procesar la statement del elemento de tamaño variable, evalúe el tamaño y almacénelo en la variable tamaño. Calcule el espacio para el elemento de tamaño variable, teniendo en cuenta la alineación. Haga espacio en la stack para el elemento de tamaño variable, luego almacene un puntero a la ubicación del elemento en la variable del puntero oculto.

Paso 4: Utilice la variable de puntero oculto para acceder a los elementos de la matriz. Utilice la variable de tamaño oculto para el operador sizeof.