AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Unterschiedliche Ergebnisse TList.Sort 32bit / 64bit CompareItems

Unterschiedliche Ergebnisse TList.Sort 32bit / 64bit CompareItems

Ein Thema von Alex_ITA01 · begonnen am 16. Mai 2023 · letzter Beitrag vom 17. Mai 2023
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.646 Beiträge
 
Delphi 12 Athens
 
#1

AW: Unterschiedliche Ergebnisse TList.Sort 32bit / 64bit CompareItems

  Alt 16. Mai 2023, 13:58
Was lernen wir daraus? Nicht auf die Hilfe hören
Vermutlich stammt die Hilfe noch von Delphi 1 oder so.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.045 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Unterschiedliche Ergebnisse TList.Sort 32bit / 64bit CompareItems

  Alt 16. Mai 2023, 22:36
Mir war so, als ob ich dieses Problem schonmal gesehen habe und jupp, hier isses.

Was lernen wir daraus? Nicht auf die Hilfe hören
Ich seh in der Hilfe keine verschachtelte Routine...

Habs mal reported
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (16. Mai 2023 um 22:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.375 Beiträge
 
Delphi 12 Athens
 
#3

AW: Unterschiedliche Ergebnisse TList.Sort 32bit / 64bit CompareItems

  Alt 16. Mai 2023, 22:58
Methoden und diese Inline, sowie die Generischen haben einen "unsichtbaren" ersten Self-Parameter.

Somit stimmt die Signatur dann nicht, im Vergleich mit einer "reinen" Prozedur.
Bei Methoden und Klassenmethoden kann man das mit Static beheben, aber für Untermethoden leider nicht.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.045 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Unterschiedliche Ergebnisse TList.Sort 32bit / 64bit CompareItems

  Alt 17. Mai 2023, 00:04
Methoden und diese Inline, sowie die Generischen haben einen "unsichtbaren" ersten Self-Parameter.

Somit stimmt die Signatur dann nicht, im Vergleich mit einer "reinen" Prozedur.
Bei Methoden und Klassenmethoden kann man das mit Static beheben, aber für Untermethoden leider nicht.
Ja, sie haben einen unsichtbaren ersten Parameter (unter 32bit nur wenn etwas aus dem äußere Scope referenziert wird, unter 64bit immer).
Dieser hat aber nix mit dem Self-Parameter wie bei Methoden (entweder Referenz zur Instanz oder zu Klasse) zu tun, sondern hier wird die Addresse zum umgebenden Stackframe übergeben.
Darüber wird der Zugriff auf die Variablen außerhalb der Routine realisiert.

Wie David auf die von mir verlinkten Stackoverflow richtig erklärt, gibt es diesen unter Win64 immer, egal ob man auf den umgebenden Scope zugreift oder nicht.
Unter Win32 gibt es diesen nur wenn man auf den umgebenden Scope zugreift - deshalb funktioniert es dort.

Unter Win64 werden die ersten vier Parameter in den Registern rcx, rdx, r8 und r9 übergeben. Also sollten Item1 und Item2 in rcx und rdx sein, da wirds auch durch den Aufruf aus Sort heraus übergeben.
Dadurch, dass die Implementierung aber nested ist, nimmt der Compiler aber an, dass diese in rdx und r8 sind, denn in rcx erwartet er den Stackzeiger, wenn die Routine lokal aufgerufen wird.

Das kann man sehr einfach auch überprüfen, wenn man einfach mal in das FormCreate CompareItems(nil, nil); reinschreibt, dort einen Stoppunkt setzt und sich das Disassembly anschaut:

Delphi-Quellcode:
mov rcx,rbp
xor edx,edx
xor r8,r8
call CompareItems
Wie man sieht, wird rbp (Frame pointer) in rcx übergeben, wie ich zuvor beschrieben habe. Verschiebe ich CompareItems nach außerhalb schauts so aus:

Delphi-Quellcode:
xor ecx,ecx
xor edx,edx
call CompareItems
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (17. Mai 2023 um 00:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.375 Beiträge
 
Delphi 12 Athens
 
#5

AW: Unterschiedliche Ergebnisse TList.Sort 32bit / 64bit CompareItems

  Alt 17. Mai 2023, 05:22
Dann hat 64 Bit damit ja noch mehr Vorteile bekommen

* alles mit Stackframes
* es gibt nur noch eine Aufrufkonvention
* und egal was man macht, es ist immer gleich
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz