2011-07-20 16 views
5

Jeśli piszę (lub używam) klasę ogólną, np. Wymień i sparametryzuj go dwoma różnymi typami wyliczonymi, czy otrzymam dwie kopie kodu JITted? Biorąc pod uwagę następujące artykuły, które omawiają, w jaki sposób JITter generuje jedną kopię dla typów odniesienia, i jedną kopię dla każdego rodzaju wartości, myślę, że sprowadza się to do "Czy każde konkretne wyliczenie uważa się za inny rodzaj wartości dla celów JITting?"Czy kompilator .NET JIT generuje inny kod dla ogólnej sparametryzowanej z różnymi wyliczeniami?

CLR vs JIT

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

W kodu 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? 
     } 
    } 
} 

Jestem zainteresowany tym wiedzieć w ogóle, ale także specjalnie dla .NET CF 3.5 (kompilator JIT) WindowsCE (EDYCJA: ponieważ jestem zainteresowany możliwymi wpływami na kodowanie). Wszelkie sugestie dotyczące najlepszego sposobu, aby to znaleźć? Myślałem o napisaniu funkcji w klasie C, która P/Wywołuje do kodu natywnego, gdzie mogę włamać się do debuggera i zbadać callstack - konkretnie adres zwrotny, ale być może ktoś może odpowiedzieć autorytatywnie na podstawie reguł językowych, których ja ' Nie wiem ...

+2

Domyślam się, że istnieje tylko jedna instancja na podstawowy typ całki, ale chciałbym usłyszeć autorytatywną odpowiedź. –

+2

Tak. Jakie tagi powinniśmy dodać, aby przyciągnąć uwagę Erica Lipperta? –

+0

'Fantastyczne przygody-w-kodowaniu', uważam, że –

Odpowiedz

5

Tak więc posunąłem się dalej i stworzyłem funkcję P/Invoke do wywołania z C <T>. Funkcja testu. Włamałem się do debuggera (okna pulpitu obsługującego debugowanie zarządzane i natywne) w funkcji natywnej, a następnie upuszczono do złożenia, a następnie śledzono za instrukcją RET z mojej funkcji natywnej. EIP (wskaźnik instrukcji) po RET był zgodny z powrotem do DWÓCH RÓŻNYCH procedur, jeden dla C <A>. Test, a drugi dla C <B>. Test. Wiele wywołań za pośrednictwem tych dwóch funkcji do wspólnej funkcji natywnej (z moim punktem przerwania) zapewniało spójne wyniki. Ponadto, EIP po RET były 0x2E0246 i 0x2E02BE, które są blisko siebie, a także nie zostały zmapowane do przestrzeni adresowej ładowanych bibliotek DLL. To wskazuje mi, że zostały JITTOWANE, a JITtowane blisko siebie w czasie, a wielkość JITtowanych metod jest mała (zgodnie z oczekiwaniami).

Tak więc odpowiedź, przynajmniej na komputery stacjonarne, polega na tym, że generics na szablonach z różnymi wyliczeniami JIT na różne procedury.

Powiązane problemy