Laden...

GetHashCode

Erstellt von onlinegurke vor 17 Jahren Letzter Beitrag vor 17 Jahren 925 Views
O
onlinegurke Themenstarter:in
778 Beiträge seit 2007
vor 17 Jahren
GetHashCode

Hallo,

ich habe mir für mathematische und physikalische Berechnungen zwei Strukturen erstellt, die eine (zur darstellung komplexer Zahlen besteht aus zwei Double-Werten und die andere zur Darstellung von physikalischen Größen besteht aus einem Double-Wert und sechs SByte-Werten.

Dazu jetzt drei Fragen:

  1. Wie viel Speicherplatz verbraten solche Strukturen dann (inklusive Header), die reinen Daten sind ja 28 bzw. 18+6*1 Byte

  2. (mir noch viel wichtiger): Wie kann man für solche Strukturen die GetHashCode-Funktion gut implementieren (meines Wissens hängt davon ja die Effizienz der Datenverarbeitung ab)

  3. Welche Schnittstellen sollte man für die Datenverarbeitung implementieren? (Hab jetzt IEquatable<T>, IComparable<T> und IFormattable)

B
1.529 Beiträge seit 2006
vor 17 Jahren
  1. Im Normalfall müssen Daten an ihrer Größe entsprechenden Speicheradressen ausgerichtet werden. Ein Byte (8Bit) also an Byte-Grenzen (jede Adresse), ein Word (16Bit) an Word-Grenzen (nur gerade Adressen), ein DWord (32Bit) an DWord-Grenzen (durch vier teilbare Adressen) etc.
    Der Compiler könnte also deine Strukturen hintereinander im Speicher anordnen, so dass sie 16 respektive 14 Bytes groß sind.
    Da du Byte-Werte hast, bringt auch eine Veränderung der Struktur eigentlich nichts, so dass der Compiler dort also nichts optimieren sollte.
    Mehr Kontrolle hast du über das Attribut StructLayout.

  2. Da du sie als Struct deklarierst, benötigen sie genau so viel Speicher, wie die enthaltenen Daten. Es kann allerdings mehr werden, wenn der Compiler die Reihenfolge der Struktur umsortiert, um wie unter 0. beschrieben zu optimieren.

  3. Ich verwende in solchen Fällen immer die XOR-Verknüpfung der Hashes der involvierten Daten.

  4. Je nach dem, was du brauchst. Ich empfehle noch ICloneable und IConvertible, wenn es Sinn macht.

S
8.746 Beiträge seit 2005
vor 17 Jahren

Das Speicherlayout differiert von 1.1 zu 2.0. In 1.1 macht der JIT das Layout vollautomatisch, die angegebene Reihenfolge wird also optimiert. StructLayout wirkt sich nur auf gemarshallte Strukturen aus.

In 2.0 wirkt sich das StructLayout auch auf managed Strukturen aus. Die Reihenfolge der Definition wird per Default beachtet. Dafür entfällt die Optimierung, also das automatische Packen von Typen die weniger als 4 Bytes lang sind. Wenn man Pech hat, belegt dann wirklich jeder Member mindestens 4 Bytes. Die Optimierung kann man aber via StructLayout und LayoutKind.Auto einschalten.

Unter 2.0 sollte man also durchaus darauf achten, wie man die Member in Strukturen anordnet, bzw. man sollte Auto-Layout verwenden.

O
onlinegurke Themenstarter:in
778 Beiträge seit 2007
vor 17 Jahren

Vielen Dank!