2009-08-06 11 views
20

Me gustaría saber cómo funciona realmente .maxstack. Sé que no tiene que ver con el tamaño real de los tipos que está declarando, sino con el número de ellos. Mis preguntas son:¿Cómo funciona la directiva .NET IL .maxstack?

  1. esto aplica sólo para la función , o para todas las funciones que están pidiendo?
  2. , incluso si es sólo para la función fueron .maxstack se desea declarar, ¿cómo sabes lo que maxstack es que si usted ha ramificación? ¿Ve y ve todas las "rutas" y devuelve el valor máximo posible?
  3. ¿Qué sucede si configuro en 16 y en realidad hay 17 variables?
  4. ¿Hay una penalización demasiado grande si I lo configuró en 256?

Respuesta

23

.maxstack es parte de la verificación IL. Básicamente, .maxstack le dice al JIT el tamaño máximo de pila que necesita reservar para el método. Por ejemplo, se traduce en x = y + (a - b)

(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 configuró .maxstack en 2 (o menos) para este método, el código no se ejecutará.

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:

  1. Sólo para la función
  2. vas a ver todas las rutas y devolver el valor máximo posible
  3. No está relacionado con el número de variables, consulte Lasse V. Karlsen 's respuesta
  4. No parece una buena idea, pero no sé.

¿De verdad tiene que calcular el .maxstack usted mismo? System.Reflection.Emit lo calcula para usted IIRC.

+0

Lo hago un poco, aunque lo dejaré como está. Solo estoy editando un código IL de otros ejecutables, pero el método que estoy insertando solo tiene 2 argumentos, por lo que creo que nunca interferirá con el .maxstack ya existente en el método IL. –

5

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 , yz, y posiblemente otros también.

Lamentablemente no sé la respuesta a sus otras preguntas, y creo que la experimentación sería una forma de encontrar algunas respuestas.

+0

Ah. Entonces, si mis expresiones nunca tienen más de 8 operandos y cualquier función a la que llamo desde mi método nunca tiene más de 8 argumentos, ¿nunca necesitaré más de .maxstack 8? –

+0

'x = y + (a - b)' necesita un tamaño de pila de 3 aunque ambos operadores tengan solo 2 operandos. – dtb

0

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. Encontré el valor máximo stakc que no está determinado por las instrucciones push & pop.

No sabía cuáles son los valores reales de los números de pila. Por lo tanto, hago referencia al código de desensamblaje ildasm para determinar el valor real máximo de la pila.

Cuestiones relacionadas