2011-07-20 10 views
5

Si escribo (o uso) una clase genérica, p. Enumerar, y parametrizarlo con dos tipos enumerados diferentes, ¿obtendré dos copias del código JITted? Dado los siguientes artículos que analizan cómo el JITter genera una copia para los tipos de referencia, y una copia para cada tipo de valor, creo que esto se reduce a, "¿Cada enum específica se considera un tipo de valor diferente con el propósito de JITting?"¿El compilador .NET JIT genera código diferente para parámetros genéricos con diferentes enumeraciones?

CLR vs JIT

http://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx#csharp_generics_topic1

En código C#:

using System.Collections.Generic; 

namespace Z 
{ 
    class Program 
    { 
     enum A {a} 
     enum B {b} 
     class C<T> 
     { 
     } 

     static void Main(string[] args) 
     { 
      var x = new C<A>(); 
      var y = new C<B>(); // does this JIT a new C constructor for enum type B? 
     } 
    } 
} 

Estoy interesado en saber esto en general, sino también específicamente para .NET CF 3.5 (Windows CE) compilador JIT (EDITAR: porque estoy interesado en posibles implicaciones de hinchamiento de código). ¿Alguna sugerencia sobre la mejor manera de descubrir esto? Estaba pensando en escribir una función en la clase C que P/invoca al código nativo, donde puedo acceder al depurador y examinar la pila de llamadas, específicamente la dirección de retorno, pero tal vez alguien puede responder con autoridad en función de las reglas de lenguaje de las que ' m no es consciente ...

+2

Supongo que solo hay una instanciación por tipo integral subyacente, pero me encantaría escuchar una respuesta autorizada. –

+2

Sí. ¿Qué etiquetas deberíamos agregar para atraer la atención de Eric Lippert? –

+0

'fabulous-adventures-in-coding', creo que –

Respuesta

5

Así que continué y armé una función P/Invocar para llamar desde una función C <T> .Test. Incursioné en el depurador (ventanas de escritorio que soportan depuración administrada y nativa) en la función nativa, luego dejé caer para ensamblar, luego seguí la instrucción RET desde mi función nativa. El EIP (puntero de instrucción) después de RET fue consistente con regresar a DOS rutinas DIFERENTES, una para C <A>. Prueba y la otra para C B >. Prueba. Múltiples llamadas a través de estas dos funciones a la función nativa común (con mi punto de interrupción) mostraron resultados consistentes. Además, los EIP posteriores de RET eran 0x2E0246 y 0x2E02BE, que están cerca uno del otro y tampoco están asignados al espacio de direcciones de un DLL cargado. Esto me indica que estaban JITted, y JIT estaban cerca el uno del otro, y el tamaño de los métodos JITted es pequeño (como se esperaba).

Así que la respuesta, al menos para el escritorio, es que los genéricos están modelados con diferentes enums JIT para diferentes rutinas.

Cuestiones relacionadas