2011-06-21 38 views
6

Myślałem o tym. zajęcia są oczywiście przekazywane przez ptr. Podejrzewam, że struktury są przekazywane przez kopiowanie, ale nie wiem na pewno. (Wydaje się, że dla tablicy int jest niepotrzebne, aby każdy element miał wartość ptr, a liczba przejść dla int)W jaki sposób generics implementuje structs?

Ale myśląc o tym, List<MyStruct> nie może znać rozmiaru mojej struktury. Co się stanie, gdy to zrobię? Czy istnieje wiele kopii "List`1" i za każdym razem, gdy używam go z rozmiarem pamięci, nie ma on tworzy nowej implementacji? (dostosowanie do nowych przesunięć T i tym podobnych).

To może mieć sens, ponieważ źródło znajduje się w bibliotece CIL wewnątrz biblioteki DLL. Ale całkowicie zgaduję, jak to się robi? Być może referencja czy strona # do standardów ECMA?

+0

Wiem niewiele o tym, jak C# implementuje generyczne. Ale dla odniesienia, tak właśnie działają szablony C++ (teoretycznie dla każdego typu tworzona jest osobna implementacja 'List'). –

+0

@Oli: tak, również wiem, że nie kompiluje metod, chyba że go używasz i potrzebujesz szablonu w nagłówku. C# nie ma nagłówków, ale generics nadal działają po zostały one skompilowane do biblioteki dll –

+1

@ Oli: Oznacza to, że będzie miał oddzielne implementacje dla każdego typu wartości i jedną wspólną implementację dla typów odniesienia. –

Odpowiedz

9

Generycy stosują koncepcję otwartych i zamkniętych typów generycznych: sparametryzowana ogólna definicja klasy (tj. List<T>) jest otwartym typem ogólnym, w którym środowisko wykonawcze generuje zamknięty typ ogólny dla każdego innego zastosowania w kodzie, tj. inny typ jest tworzony dla List<int> i dla List<MyStruct> - dla każdego zamkniętego typu generycznego rozmiar i typ T jest znany w czasie wykonywania.

wyjaśnień MSDN:

Jeżeli ogólny typ lub sposób wkompilowany Microsoft pośredniego języka (MSIL) zawiera metadanych identyfikującą go jako mające typu parametrów. Sposób użycia MSIL dla ogólnego typu różni się w zależności od tego, czy podany parametr typu jest wartością typu , czy też typem odniesienia.

Gdy typ ogólny najpierw zbudowane z rodzaju waluty, parametr środowisko wykonawcze tworzy wyspecjalizowanej ogólny parametrem dostarczonej lub parametrów podstawiony w odpowiednich miejscach w MSIL. Specialized Typy ogólne są tworzone jeden raz dla każdego unikalnego typu wartości, który jest używany jako parametr o wartości .

Generics działają nieco inaczej dla typów odniesienia . Po raz pierwszy generic typ jest skonstruowany z dowolnym typem odniesienia , środowisko wykonawcze tworzy wyspecjalizowanego rodzaju generycznego z obiektami odniesień podstawionych dla parametrów w MSIL. Następnie każdy czas, że typ jest skonstruowany wystąpienia z typem odniesienia jako jej parametru, niezależnie od tego, jaki rodzaj to, środowisko wykonawcze ponownie wykorzystuje uprzednio utworzoną specjalną wersję typu rodzajowego. Jest to możliwe , ponieważ wszystkie odniesienia mają ten sam rozmiar .

2

CLR kompiluje 1 wersję klasy ogólnej i używa jej dla wszystkich typów referencji. Kompiluje także 1 wersję dla każdego użycia typu wartości, aby zoptymalizować wydajność.

Powiązane problemy