Was ist das C # -Äquivalent des C ++ - Vektors?
Ich suche nach dieser Funktion:
Ein dynamisches Array von zusammenhängend gespeichertem Speicher ohne Leistungseinbußen für den Zugriff im Vergleich zu Standard-Arrays.
Ich habe gesucht und sie sagen .NET equivalent to the vector in C++ is the ArrayList
, also:
Verfügt ArrayList über diese zusammenhängende Speicherfunktion?
Antworten:
Sie können einen verwenden,
List<T>
und wennT
es sich um einen Werttyp handelt, wird dieser im zusammenhängenden Speicher zugewiesen, was beiT
einem Referenztyp nicht der Fall wäre .Beispiel:
List<int> integers = new List<int>(); integers.Add(1); integers.Add(4); integers.Add(7); int someElement = integers[1];
quelle
List<T>
Klasse enthält viele Beispiele, aber ich habe meine Antwort aktualisiert, um eines aufzunehmen.T
einen zusammenhängenden Speicher haben , wenn es sich um einen Referenztyp handelt. Es ist im Grunde eine Reihe von Zeigern ...T[]
... das OP forderte "keine Leistungseinbußen für den Zugriff im Vergleich zu Standard-Arrays" undList<T>
stellt dies bereit. Und wennT
es sich um einen Referenztyp handelt, der analog zuT*
C ++ ist, erhalten Sie genau so viele Zusammenhänge wie in C ++. Wenn man möchte, dass die Objekte selbst zusammenhängend sind, braucht man natürlich Werttypen ... in beiden Sprachen. Der Unterschied besteht natürlich darin, dass in C ++ jeder Typ entweder als Wert oder als Referenz verwendet werden kann, während er in C # über die Klassen- / Strukturunterscheidung eine Eigenschaft des Typs ist.List<T>
wird immer intern als verknüpfte Liste implementiert. Wie dehnt es sich dann dynamisch aus, wenn wir anrufenAdd()
? So etwas wie VB6s, mitRedim Preserve
denen das gesamte Array an einen neuen Speicherort kopiert wurde?List<T>
erstellt intern ein kleines ArrayT[]
. Die Elemente werden intern zum Array hinzugefügt. Sobald die Größe des Arrays abgeschlossen ist, wird ein neues Array erstellt, das doppelt so groß ist wie das vorherige. Die Daten werden in das neue größere Array kopiert, das kleinere wird zerstört und so weiter. Ein Entwickler kann .NET einen Hinweis geben, um ein ausreichend großes internes Array zu erstellen, bevor er denList
Via-Konstruktor ausfüllt :new List<T>(expected_array_size)
.verwenden
List<T>
. Intern werden Arrays verwendet, und Arrays verwenden zusammenhängenden Speicher.quelle
private T[] _items;
diese, die für den Backend-Speicher verwendet wird, Referenztyp oder nicht.Halten Sie sich zunächst von
Arraylist
oder fernHashtable
. Diese Klassen gelten zugunsten von Generika als veraltet. Sie sind immer noch in der Sprache für Legacy-Zwecke.Was Sie jetzt suchen, ist die
List<T>
Klasse. Beachten Sie, dass Sie, wenn T ein Werttyp ist, aus offensichtlichen Gründen über einen Contiguos-Speicher verfügen, nicht jedoch, wenn T ein Referenztyp ist.quelle
C # hat viele Referenztypen. Selbst wenn ein Container die Referenzen zusammenhängend speichert , können die Objekte selbst über den Heap verstreut sein
quelle
Es sieht so aus, als würde CLR / C # bald eine bessere Unterstützung für Vector <> erhalten.
http://blogs.msdn.com/b/dotnet/archive/2014/04/07/the-jit-finally-proposed-jit-and-simd-are-getting-married.aspx
quelle