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:

  1. se aplica esto sólo por el función, o para todas las funciones que estamos pidiendo?
  2. 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?
  3. ¿Qué pasa si lo fijo a 16 y en realidad hay 17 variables?
  4. ¿Hay una demasiado grande de una penalización si ponerlo a 256?
¿Fue útil?

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:

  
      
  1. se aplica esto sólo para la función, o para todas las funciones que están pidiendo?
  2.   

Sólo para la función

  
      
  1. 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?
  2.   

ir y ver todos los caminos y devuelva el valor máximo posible

  
      
  1. ¿Qué pasa si lo fijo a 16 y, de hecho hay 17 variables?
  2.   

Es sin relación con el número de variables, ver Respuesta Lasse V. Karlsen 's

  
      
  1. ¿Hay una demasiado grande de una multa si lo fijo a 256?
  2.   

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top