Sortieren einer TListTPairInteger-Ganzzahl in 64 Bit gegenüber 32 Bit unter Verwendung der Standardsortierung

8

Es scheint einen Unterschied zwischen der Standardsortierung eines TPair beim Kompilieren unter 32 Bit gegenüber 64 Bit zu geben. Unter 32 Bit verhält sich die Standardsortierung so, als ob sie nach dem Schlüssel des Paares sortiert, bei 64 Bit sortiert sie nach dem Wert. Ist das zu erwarten, oder fehlt mir etwas?

Getestet mit Delphi XE2, update 4. Lassen Sie in einer VCL-Anwendung eine Schaltfläche, ein Kontrollkästchen und eine List auf dem Bildschirm erscheinen, und deklarieren Sie den folgenden Typ

%Vor%

dann den Code unten in die Schaltfläche OnClick und run. Unter 32 Bit, die die Standardsortierung verwenden, werden die Paare nach Schlüssel aufgelistet, d. H. 1,2,3,4,5,6. Unter 64 Bits sind die Paare nach Wert aufgelistet, d. H. 2,5,6,7,8,9 und NICHT nach Schlüssel.

Damit der Code auf beiden Plattformen konsistent funktioniert, musste ich meinen eigenen Vergleicher angeben, um die Sortierung nach Schlüssel auf einer 64-Bit-ausführbaren Datei zu erzwingen.

%Vor%

Ende;

    
Paul 13.03.2014, 13:29
quelle

1 Antwort

6

Der Standardvergleich für einen solchen Typ ist ziemlich willkürlich. Der Compiler verwendet keine Kenntnis des Aufbaus des Datensatzes. Sie haben ihm sicherlich nicht gesagt, welches Mitglied der primäre Sortierschlüssel sein soll. Es ist also frei zu tun, was es will.

In 32 Bit wird der Standardvergleich für einen 8-Byte-Datensatz mit einem Aufruf einer CompareMem -ähnlichen Funktion implementiert. So werden Bytes in aufsteigender Reihenfolge der Adresse verglichen. Daher ist der Schlüssel wichtiger.

Unter 64 bit behandelt der Standard-Vergleicher den Typ als eine vorzeichenlose 64-Bit-Ganzzahl, und daher werden Bytes in abnehmender Adressreihenfolge verglichen, wobei dies Little-Endian ist. Und so ist der Wert signifikanter.

Der entsprechende Code befindet sich im Abschnitt zur Implementierung von Generics.Defaults :

%Vor%

Die Quintessenz ist, dass Sie immer einen echten Vergleich liefern müssen, wenn Sie Datensätze sortieren wollen. Nur eingebaute numerische und String-Typen haben gut definierte geordnete Vergleiche.

    
David Heffernan 13.03.2014, 13:40
quelle

Tags und Links