Frage

MSDN sagt, dass eine Klasse, die 16 Bytes oder weniger wäre besser als eine Struktur behandelt werden würde [Bearbeiten] .
Warum ist das so?
Heißt das, dass, wenn eine Struktur ist mehr als 16 Bytes ist es weniger effizient als eine Klasse oder ist es das gleiche?
Wie bestimmen Sie, ob Ihre Klasse unter 16 Bytes ist?
Was schränkt eine Struktur aus wie eine Klasse handeln? (Neben disallowing parameterlos Konstrukteurs)

War es hilfreich?

Lösung

Es gibt ein paar verschiedene Antworten auf diese Frage, und es ist ein wenig subjektiv, aber einige Gründe, die ich denken kann, sind:

  • Structs sind Wert-Typ, Klassen sind Referenztyp. Wenn Sie mit 16 Bytes für Gesamtspeicher, ist es wahrscheinlich nicht wert Speicherreferenzen (4 bis 8 Byte) für jeden zu schaffen.
  • Wenn Sie wirklich kleine Objekte haben, können sie oft auf den IL-Stapel geschoben werden, statt Verweise auf die Objekte. Dies kann wirklich etwas Code beschleunigen, wie Sie einen Speicher dereferenzieren auf der Aufgerufene Seite eliminiert wird.
  • Es ist ein bisschen mehr „Flaum“ im Zusammenhang mit Klassen in IL, und wenn Sie Ihre Datenstruktur sehr klein ist, keine dieser Flaum würde ohnehin verwendet werden, es ist also nur zusätzliche Junk Sie nicht brauchen.

Der wichtigste Unterschied zwischen einer Struktur und einer Klasse, ist jedoch, dass structs Werttyp ist und Klassen sind Referenztyp.

Andere Tipps

Mit dem „effizient“, sie sprechen wahrscheinlich über die Menge an Speicher nimmt es die Klasse oder Struktur darzustellen.

auf der 32-Bit-Plattform, ein Objekts Zuteilen erfordert ein Minimum von 16 Bytes. Auf einer 64-Bit-Plattform ist die minimale Objektgröße 24 Bytes. Also, wenn Sie es rein von der Menge des verwendeten Speichers suchen, eine Struktur, die weniger als 16 Byte Daten enthält wird „besser“ als die entsprechende Klasse.

Aber die Menge des verwendeten Speichers ist nicht die ganze Geschichte. Werttypen (structs) unterscheiden sich grundsätzlich als Referenztypen (Klassen). Structs kann unbequem sein, mit zu arbeiten, und kann tatsächlich Performance-Probleme verursachen, wenn Sie nicht vorsichtig sind.

Die wirkliche Antwort, natürlich, verwenden je nachdem, was am besten in Ihrer Situation funktioniert. In den meisten Fällen werden Sie viel besser dran Klassen verwenden.

Überprüfen Sie diesen Link, ich habe es auf eine der Antworten in SO heute gefunden: . NET Typ Internals . Sie können auch SO und Googeln für „Referenztypen vs Wertetypen“ für Unterschiede zwischen den Strukturen und Klassen versuchen zu suchen.

  
    

Was schränkt eine Struktur aus wie eine Klasse handeln?

  

Es gibt viele Unterschiede. Sie können nicht von einer Struktur, zum Beispiel erben.

Sie können keine virtuellen Methoden, so dass Sie nicht eine Struktur verwenden, um eine Schnittstelle zu implementieren. Instanzmethoden in structs können struct private Felder zugreifen, aber abgesehen davon, dass sie viel wie auxilirary „Helfer“ Funktionen verhalten (für unveränderliche Strukturen, sie brauchen manchmal nicht einmal private Daten zuzugreifen). Also ich finde sie nicht so nah wie „wertvoll“ als Klassenmethoden sein.

Dies ist auf die unterschiedliche Art und Weise, dass der CLR structs und Klassen behandelt. Structs sind Werttypen, was bedeutet, sie auf dem Stapel leben, anstatt in dem verwalteten Heap. Es ist eine gute Faustregel zu structs klein zu halten, denn sobald Sie anfangen, sie als Methode Argumente zu übergeben Sie Overhead entstehen werden als structs in ihrer Gesamtheit kopiert werden, wenn sie an eine Methode übergeben.

Da Klassen eine Kopie ihrer Bezugnahme auf Methoden übergeben verursachen sie viel weniger Aufwand, wenn sie als Methodenargumente verwendet.

Der beste Weg, um die Größe Ihrer Klasse zu bestimmen, ist die Anzahl der Bytes, die von allen Mitgliedern der Klasse plus ein extra 8 Byte für CLR-Overhead Material (der Sync-Block-Index und dem Hinweis auf die Art der erforderlich ist, um insgesamt Objekt).

Structs unterscheiden sich von Klassen, weil sie auf dem Stapel gespeichert sind, und nicht auf dem Heap. Das bedeutet, dass jedes Mal, wenn Sie eine Methode mit der Struktur als Parameter aufrufen, wird eine Kopie erstellt und an die Methode übergeben. Deshalb ist großer structs extrem ineffizient ist.

Ich würde entmutigen aktiv structs trotzdem zu verwenden, weil es einige geringfügige Fehler verursachen könnte: zum Beispiel wenn Sie ein Feld einer Struktur ändern, es ist nicht für den Anrufer zu reflektieren gehen (weil Sie nur die Kopie geändert.) - die Klassen völlig anderes Verhalten ist

So die 16 Bytes Ich denke, eine vernünftige maximale Größe einer Struktur ist, aber immer noch in den meisten Fällen ist es besser, eine Klasse zu haben. Wenn Sie noch eine Struktur erstellen möchten, versuchen Sie es zumindest unveränderlich zu machen.

Im Speicher wird die Struktur der Daten direkt halten, während eine Klasse mehr wie ein Zeiger verhalten wird. Das allein macht einen wichtigen Unterschied, da die Struktur als Parameter an eine Methode übergeben wird seine Werte (kopieren Sie sie auf dem Stapel) passieren, während die Klasse wird die Bezugnahme auf die Werte übergeben. Wenn die Struktur groß ist, werden Sie eine Menge von Werten auf jeden Methodenaufruf werden zu kopieren. Wenn es wirklich klein ist, um die Werte zu kopieren und mit ihnen direkt wahrscheinlich schneller sein als den Zeiger zu kopieren und sie von einem anderen Ort greifen zu müssen.

Über Einschränkungen. Sie können es nicht zuordnen auf null (obwohl Sie Nullable <> verwenden können), und Sie haben es zu initialisieren direkt

eine Instanz einer Struktur Kopieren benötigt weniger Zeit als eine neue Instanz einer Klasse und das Kopieren von Daten von einem alten zu schaffen, aber Klasseninstanzen gemeinsam genutzt werden können und struct Instanzen nicht. So „structvar1 = structvar2“ struct erfordert neue Instanz kopiert, während „classvar1 = classvar2“ ermöglicht classvar1 und classvar2 zu derselben struct Instanz beziehen (ohne einen neuen erstellen zu müssen).

Der Code, um die Schaffung neuer Struktur Instanzen zu handhaben ist, bis zu 16 Bytes für Größen optimieren. Größere Strukturen sind weniger effizient abgewickelt. Structs sind ein Gewinn in Fällen, in denen jede Variable, die eine Struktur, eine unabhängige Instanz hält halten wird (das heißt, es gibt keinen Grund zu erwarten, dass ein bestimmter zwei Variablen identische Instanzen halten); sie sind nicht viel von einem Gewinn in den Fällen (wenn sie einen Sieg überhaupt sind), wo viele Variablen die gleiche Instanz halten konnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top