¿Cómo funciona la Directiva .NET IL .maxstack?
-
12-09-2019 - |
Pregunta
Me gustaría saber ¿cómo .maxstack realmente funcionan. Sé que no tiene que ver con el tamaño real de los tipos que se está declarando pero con el número de ellos. Mis preguntas son:
- se aplica esto sólo por el función, o para todas las funciones que estamos pidiendo?
- incluso si es sólo para la función fueron .maxstack se desea declarar, ¿cómo saber lo que es si maxstack usted ha ramificación? Vas a ver todos los "caminos" y devolver el el máximo valor posible?
- ¿Qué pasa si lo fijo a 16 y en realidad hay 17 variables?
- ¿Hay una demasiado grande de una penalización si ponerlo a 256?
Solución
.maxstack
es parte de la verificación IL. Básicamente .maxstack
dice el JIT el tamaño de pila máximo que necesita para reservar para el método. Por ejemplo, x = y + (a - b)
traduce a
(Pseudo IL:)
1. Push y on the stack
2. Push a on the stack
3. Push b on the stack
4. Pop the last two items from the stack,
substract them and
push the result on the stack
5. Pop the last two items from the stack,
add them and
push the result on the stack
6. Store the last item on the stack in x and
pop the last item from the stack
Como se puede ver, hay un máximo de 3 puntos de la pila en cada momento.
Si desea configurar .maxstack
a 2 (o menos) de este método, el código no se presentaría.
Además, no se puede tener algo como esto ya que requeriría un tamaño de pila infinita:
1. Push x on the stack
2. Jump to step 1
Para responder a sus preguntas:
- se aplica esto sólo para la función, o para todas las funciones que están pidiendo?
Sólo para la función
- incluso si es sólo para la función se .maxstack se desea declarar, ¿cómo saber lo que maxstack es si usted tiene ramificación? Vas a ver todos los "caminos" y devuelva el valor máximo posible?
ir y ver todos los caminos y devuelva el valor máximo posible
- ¿Qué pasa si lo fijo a 16 y, de hecho hay 17 variables?
Es sin relación con el número de variables, ver Respuesta Lasse V. Karlsen 's
- ¿Hay una demasiado grande de una multa si lo fijo a 256?
No parece como una buena idea, pero no sé.
¿De verdad tiene que calcular el .maxstack
ti mismo? System.Reflection.Emit
calcula que para usted IIRC.
Otros consejos
No tiene nada que ver con el número de las variables declaradas, sino que todo lo relacionado con el número de valores que necesita para empujar en una pila en un momento dado con el fin de calcular alguna expresión.
Por ejemplo, en la siguiente expresión, asumiría 2 valores tiene que ser empujada en la pila:
x = y + z;
Esto no está relacionado con el hecho de que hay al menos 3 variables presentes, x, y, y z, y, posiblemente, otros también.
Por desgracia, no sé la respuesta a sus otras preguntas, y me supongo que la experimentación sería una manera de encontrar algunas respuestas.
Se puede hacer referencia a la siguiente y la ECMA STANDARD para obtener una mejor comprensión:
void msd(string a,
string b,
string c,
string d,
string e)
{
Console.WriteLine(a);
}
msd("a","b","c","d","e");
Cuando corro ildasm.exe
Tengo esto:
{
.entrypoint
// Code size 40 (0x28)
.maxstack 8
IL_0000: nop
IL_0001: nop
IL_0002: ldstr "a"
IL_0007: ldstr "b"
IL_000c: ldstr "c"
IL_0011: ldstr "d"
IL_0016: ldstr "e"
IL_001b: call void sf.Program::'<Main>g__msd|0_0'(string,
string,
string,
string,
string)
IL_0020: nop
IL_0021: call string [mscorlib]System.Console::ReadLine()
IL_0026: pop
IL_0027: ret
} // end of method Program::Main
de lo anterior. He encontrado el valor máximo stakc
que no está determinada por el empuje y pop instrucciones.
Yo no sabía lo que los valores de los números reales son pila. Por lo tanto, me refiero el código ildasm
desmontaje para determinar el valor máximo de pila real.