2009-04-04 7 views
9

¿Hay alguna manera en .NET, usando Reflection.Emit, para acceder al elemento que está más arriba de la pila? Entonces, si A está arriba, y B a continuación - Quiero procesar B, entonces A. Sería correcto duplicar B arriba de A (ya que puedo simplemente "abrir" la segunda B cuando llegue a ella).Reflection.Emit: accede al elemento más al máximo de la pila

Actualmente, estoy declarando local:

LocalBuilder loc = il.DeclareLocal(typeof(Foo)); 
    il.Emit(OpCodes.Stloc, loc); // store and pop topmost stack item 
    // work with (pop) previous stack item 
    il.Emit(OpCodes.Ldloc, loc); // push old topmost stack item 

¿Existe una ruta que no necesita lo local explícito?

Respuesta

7

No lo creo. En IL no hay instrucciones como swap que te permitan hacer lo que quieras. ¿Por qué ves que usar un local es objetable? Si el compilador JIT es lo suficientemente bueno, esto no dará como resultado un código de máquina más lento que el uso de una operación de intercambio hipotético en IL.

+1

Para el "por qué" - esto es en el código generado que tendría que introducir más locales que yo quiera. Si pudiera usar la parte superior de la pila, podría ahorrar cantidades no triviales de espacio de pila (los locales están reservados independientemente del uso, AFAIK). –

1
+0

El autor del proyecto de código tiene pensamientos similares a mí, entonces. SWAP u OVER haría el trabajo ;-p Tendré que verificar mi VM 4.0, pero no tengo la esperanza de que sea diferente allí ... –

1

en línea con lo que kvb dicho, usted podría tratar de una pequeña función para hacer algo de reordenamiento. No estoy seguro de si sería más rápido.

+0

Buena idea, pero casi seguro que no; incluso si el JUT lo marcó. –

1

Encontré este mismo problema. Quería generar un método bastante grande y a menudo quería 'intercambiar' para almacenar un valor calculado. No estaba contento con el gran volumen de lugareños que aparecían en ildasm y noté que BeginScope/EndScope no era de ninguna ayuda. Terminé creando un 'intercambio' local para el contexto de mi método y reutilizándolo para cada operación de intercambio. Hace que la IL generada sea más limpia; no estoy seguro de si tiene algún impacto significativo en el rendimiento.

Cuestiones relacionadas