2015-07-29 9 views
11

Podczas czytania kodu źródłowego Roslyn on GitHub zauważyłem bardzo popularną klasę ObjectPool<T>. Służy do zmniejszenia obciążenia pamięci.Dlaczego roslyn zawija obiekty w struktury po umieszczeniu w tablicach?

Wewnętrznie używa an array do przechowywania połączonych obiektów. Nie rozumiem, dlaczego używa on prywatnej struktury o nazwie Element zawierającej pojedyncze pole typu T jako element tablicy, zamiast po prostu używać T.

Czy to nie dotyczy wydajności? Narzut pamięci?

Odpowiedz

14

Może to wynikać z powodów związanych z wydajnością. Zobacz this article by Jon Skeet.

Podsumowując, tablice typów wartości są niezmienne w języku C#, co oznacza, że ​​środowisko wykonawcze może uniknąć sprawdzania zgodności podczas przechowywania elementów w tablicy. W artykule Pan Skeet używa struktury otoki podobnej do tej, którą opisałeś i pokazuje poprawę wydajności zapisu w tablicy.

+0

Święte ..... Nie spodziewałem się tego, powinno być możliwe zadeklarowanie samych tablic jako niezmiennych. Byłoby o wiele ładniejsze niż to obejście. Teraz muszę zmienić pewne rzeczy w moim silniku wizualizacji. : -/ –

+0

Cholera ... Nie wiedziałem tego. Zdecydowanie sprawdzę kod jutro: - \ –

+1

Wysłałem [propozycję funkcji] (https://github.com/dotnet/roslyn/issues/4211) na [projekcie Roslyn] (https: // github .com/dotnet/roslyn). Ma to na celu ułatwienie korzystania z niezmiennych tablic. – Wazner