Frage

Wenn Sie sehr kleine Objekte haben müssen, sagen, dass enthält 2 Eigenschaft float, und Sie werden Millionen von ihnen haben, die nicht Gonna sofort „zerstört“ werden, sind structs eine bessere Wahl oder Klassen?

Wie in xna als Bibliothek gibt es point3s, etc als structs aber wenn Sie benötigen auf diese Werte für eine lange Zeit zu halten, wäre es eine Leistung Bedrohung darstellen?

War es hilfreich?

Lösung

Im Gegensatz zu den meisten Fragen zu structs scheint dies eigentlich eine gute Verwendung einer Struktur zu sein. Wenn die Daten, die es Wert enthält Typen sind, und Sie werden eine Menge von diesen verwenden, würde auch eine Struktur arbeiten.

Einige Tipps:

:: Die Struktur sollte nicht größer sein als 16 Bytes, oder Sie die Performance-Vorteile verlieren.

:: Machen Sie die Struktur unveränderlich. Das macht die Verwendung klarer.

Beispiel:

public struct Point3D {

   public float X { get; private set; }
   public float Y { get; private set; }
   public float Z { get; private set; }

   public Point3D(float x, float y, float z) {
      X = x;
      Y = y;
      Z = z;
   }

   public Point3D Invert() {
      return new Point3D(-X, -Y, -Z);
   }

}

Andere Tipps

Die Antwort hängt davon ab, wo die Objekte / Werte werden schließlich gespeichert werden. Wenn sie in einer nicht typisierte Sammlung wie Arraylist gespeichert werden sollen, dann Sie am Ende ihnen Boxen. Boxen erzeugen einen Objekt-Wrapper für eine Struktur und die Fußabdruck ist das gleiche wie bei einem Klassenobjekt. Auf der anderen Seite, wenn Sie eine typisierte Array wie T Verwenden Sie [] oder Liste, dann wird mit structs speichert nur die tatsächlichen Daten für jedes Element mit Stellfläche für ganze Sammlung nur und nicht seine Elemente.

So structs sind effizienter für den Einsatz in T [] Arrays.

Die große Sorge ist, ob der Speicher auf dem Stack oder dem Heap zugeordnet wird. Structs geht in dem Stapel standardmäßig und der Stapel ist in der Regel sehr viel begrenzter in Bezug auf Raum. So Erstellen nur eine ganze Reihe von Strukturen wie das kann ein Problem sein.

In der Praxis aber ich glaube nicht wirklich, dann ist es, dass große Sache. Wenn Sie, dass viele von ihnen sind sie wahrscheinlich Teil einer Klasseninstanz (auf dem Heap) irgendwo.

Struct scheint Recht für diese Anwendung.

Beachten Sie, dass die „müssen auf diese Werte halten“ bedeutet, ihre Lagerung auf dem Heap irgendwo, wahrscheinlich ein Array-Feld einer Klasseninstanz.

Eine Sache zu achten ist, dass diese auf dem großen Objekt-Heap in einer Zuordnung zur Folge hat. Es ist nicht so klar, wie, wenn über, dieser Haufen defragmentiert selbst aber für sehr lange gelebt Objekte, die vielleicht kein Problem ist.

Klasse verwendet für Millionen dieser Datentypen wahrscheinlich im Schervolumen dereferencing wahrscheinlich Platz auf dieser Art teuer wäre, dass für Operationen statt.

In der Regel großer Arrays von nicht-Aliasing (das heißt unshared) Daten des gleichen Typs am besten in structs für die Leistung gespeichert, da die Anzahl des Indirekt reduzieren. (Siehe auch when-ist-structs-the-Antwort ). Der genaue Performance-Unterschied zwischen Klasse und Struktur hängt von Ihrer Nutzung. (ZB in Betrieb, sind Sie nur den Zugriff Teile der Struktur? Haben Sie viele temporäre Kopieren tun? Wenn die Struktur klein ist, es ist wahrscheinlich immer besser zu bedienen, aber wenn es groß ist, können Sie temporäre Kopien zu schaffen verlangsamen. Wenn Sie machen es unveränderlich müssen Sie immer das ganze kopieren Sie den Wert zu ändern.)

Im Zweifelsfall messen.

Da Sie Interesse an möglichen langfristigen Auswirkungen, die nicht durch eine solche Messung offensichtlich sein können, bewusst sein, dass solche Anordnungen sind auf dem groß Objektheap wahrscheinlich gespeichert und sollten wiederverwendet werden, anstatt zerstört und neu zugewiesen . (Siehe CRL Inside Out: Large Object Heap Uncovered .)

Wenn größere Größe structs vorbei in Anrufen mögen Sie könnten sie mit dem ref Argumente übergeben Kopieren zu vermeiden.

Werttypen (struct) sind gut für die Art, die nicht oft auf Heap zugeordnet ist, das heißt, sie sind meist in einem anderen Referenz- oder Werttyp enthalten ist.

Das Vector3 Beispiel Sie gab, ist ein perfektes Beispiel. Sie werden selten Vector3 in Haufen haben baumelt, werden sie die meiste Zeit in einer Art enthalten sein, die sich in Haufen ist, oder als lokale Variable verwendet wird, wobei in diesem Fall, wird es auf dem Stack zugeordnet werden.

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