2011-08-04 12 views
57

Co to jest odpowiednik C++ wektora C++?C# odpowiednik wektora C++ z przyległą pamięcią?

szukam tej funkcji:

Aby mieć dynamiczną tablicę zwarty przechowywanej pamięci, która nie ma dostępu do spadku wydajności w porównaniu standardowych tablic.

szukałem i mówią .NET equivalent to the vector in C++ is the ArrayList, więc:

Do ArrayList mieć tę funkcję pamięci ciągły?

+4

nie Czy CLR wystarczająco blisko do metalu, aby określić (lub nawet konsekwentnie spodziewać), w jaki sposób struktura jest alokowana w pamięci? – Aphex

Odpowiedz

68

Można użyć numeru List<T>, a gdy T jest typem wartości, zostanie mu przydzielone w ciągłej pamięci, co nie byłoby możliwe, jeśli typem odniesienia jest T.

przykład:

List<int> integers = new List<int>(); 
integers.Add(1); 
integers.Add(4); 
integers.Add(7); 

int someElement = integers[1]; 
+1

Czy możesz wskazać jakiś przykład? – cMinor

+2

@ cMinor, dokumentacja klasy 'List ' zawiera wiele przykładów, ale zaktualizowałem moją odpowiedź, aby dołączyć jedną. –

+4

Nie jestem w 100% zaznajomiony z CLR, ale ma to sens, że nawet jeśli 'T' jest typem odniesienia, nadal będziesz mieć ciągłą pamięć. Zasadniczo jest to zbiór wskaźników ... – josaphatv

14

zastosowanie List<T>. Wewnętrznie używa tablic i tablic, które wykorzystują ciągłą pamięć.

+6

+1. Dlaczego ludzie upierają się, by wspominać o 'ArrayList'? –

+1

To nie do końca prawda. Jeśli T jest typem odniesienia, nie będzie ciągłej pamięci. –

+2

@Matteo, jeśli spojrzeć na źródło, istnieje 'private T [] _items;' używane do przechowywania wewnętrznej bazy danych, typu referencyjnego lub nie. –

12

C# ma wiele typów referencji. Nawet jeśli sklepach Container referencje zwarty, same obiekty mogą być rozproszone przez hałdę

12

Przede wszystkim, z dala od Arraylist lub Hashtable. Te klasy należy uznać za przestarzałe, na korzyść leków generycznych. Wciąż są w języku do celów starszych.

Teraz szukamy klasy List<T>. Zauważ, że jeśli T jest typem wartości, będziesz miał pamięć contiguos, ale nie, jeśli T jest typem odniesienia, z oczywistych powodów.