2014-11-05 10 views

Odpowiedz

1

Oba mają ten sam rozmiar, ponieważ są traktowane jak każdy inny typ wartości i przydzielane na miejscu w stercie.

long startMemorySize2 = GC.GetTotalMemory(true); 
var MatrixOfCells = new Cell[1000, 1000]; 
long matrixOfCellSize = GC.GetTotalMemory(true); 

long startMemorySize = GC.GetTotalMemory(true); 
var MatrixOfInts = new int[1000, 1000]; 
long matrixOfIntSize = GC.GetTotalMemory(true); 

Console.WriteLine("Int Matrix Size:{0}. Cell Matrix Size:{1}", 
    matrixOfIntSize - startMemorySize, matrixOfCellSize - startMemorySize2); 

Oto niektóre zabawy z czytania Jeffery Richtera, w jaki sposób są przydzielane tablice http://msdn.microsoft.com/en-us/magazine/cc301755.aspx

+0

Nic lepszego niż dowód, z możliwością replikacji metodą ekstrakcji. Dzięki! –

1

Używając operatora sizeof w C# i wykonując następujący kod (pod Mono 3.10.0) uzyskać następujące wyniki:

struct Cell 
    { 
     int Value; 
    } 

    public static void Main(string[] args) 
    { 
     unsafe 
     { 
      // result is: 4 
      var intSize = sizeof(int); 
      // result is: 4 
      var structSize = sizeof(Cell); 
     } 
    } 

Wygląda więc na to, że jest liczbą całkowitą i struct przechowywania liczby całkowitej konsumpcji tyle samo pamięci, dlatego założyłbym, że tablice wymagałyby równej ilości pamięci.

+0

Ciekawe, ale tablica będzie zawierać informacje typu na komórkę ?. Rozważmy, że struct może implementować interfejs, więc możemy mieć ... var Matrix = IMyStruct [100,100]; (gdzie struktura Cell implementuje interfejs IMyStruct), to może CLR przechowuje informacje o tym, który programator jest przypisany do komórki. –

+0

Hmm, to interesujące pytanie, ale przypuszczam, że w przypadku przechowywania struktur jako interfejsów pojawiłoby się boksowanie, które zwiększyłoby zużycie pamięci, ponieważ twoje konstrukcje byłyby następnie konwertowane na typy odniesienia? Jeśli przechowujesz swoje pliki po prostu przy użyciu ich typu wartości (zgodnie z opisem w pytaniu), nie musisz przechowywać żadnych dodatkowych informacji o typie. – pgenfer

+0

Nasza wiedza jest ograniczona. Mam nadzieję, że ktoś dobrze zorientowany w takich niskich poziomach pytań, jak Eric Lippert czy Jon Skeet, mógłby odpowiedzieć na to pytanie. –

1

W tablicy z elementami o typie wartości wszystkie elementy muszą być dokładnie tego samego typu. Obiekt przechowujący tablicę musi przechowywać informacje o typie elementów w niej zawartych, ale informacja ta jest przechowywana tylko raz na tablicę, a nie raz na element.

Należy zauważyć, że ponieważ tablice otrzymują specjalną obsługę w .NET Framework (w porównaniu do innych typów kolekcji), tablice typu struktury umożliwiają działanie elementów zawartych w nich struktur na "na miejscu". W konsekwencji, jeśli można ograniczyć się do przechowywania struktury w tablicy (a nie do innego typu kolekcji) i zminimalizować niepotrzebne kopiowanie instancji struct, możliwe jest wydajne działanie z strukturami prawie dowolnego rozmiaru. Jeśli zachodzi potrzeba posiadania zbioru rzeczy, z których każda będzie wiązała się z czterema wartościami Int64 i czterema wartościami Int32 (w sumie 48 bajtów), użycie tablicy ośmioelementowych struktur o otwartym polu może być bardziej wydajne i semantycznie czystsze niż reprezentowanie każdej rzeczy za pomocą czterech elementów z Int64[] i czterech elementów z Int32[] lub za pomocą tablicy odwołań do nieudostępnianych obiektów klasy klasyfikujących.

+0

Tablica nie musi nawet przechowywać typu elementów, ponieważ jest uwzględniony we własnym typie. Dotyczy wszystkich rodzajów tablic: wartości, odniesienia, interfejsu itd.Oczywiście, z tablicami referencyjnymi i typami interfejsów, tablica po prostu obsługuje rzeczywiste elementy, a same elementy przechowują swoje własne typy. –

+0

@BenVoigt: Myślałem, że przeczytałem gdzieś, że pole "type" w nagłówku obiektu tablicy po prostu zidentyfikowało go jako tablicę i że typ elementu był przechowywany jako część samego obiektu tablicy. W każdym przypadku obiekt tablicy z pewnością zachowałby informacje wystarczające do zidentyfikowania typu elementów, niezależnie od tego, czy jest osiągnięty przez przechowywanie typu elementu niezależnie od jego, własnego, czy też poprzez osobny obiekt "Typ" zadeklarowany dla każdej kombinacji tablicy wymiarowość i typ elementu, a każda z tablic zapisuje odniesienie do tego. – supercat

+0

Uzgodnione. Mówię tylko, że nie chodzi tylko o tablice wartości, które są jednorodne. Tablice polimorficznych typów nadal mają tylko jeden typ elementu, a różne typy elementów są wyszukiwane z nagłówka obiektu każdego elementu. –