Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Case Frage (https://www.delphipraxis.net/23788-case-frage.html)

Phoenix 9. Jun 2004 19:34

Re: Case Frage
 
Zitat:

Zitat von Nicodius
.. naja um wieder OT zu werden: er kann so ja auch prüfen ob eine charKETTE vorhanden ist :?

Nein, kann er nicht. Kannst Du strings abzählen?

Sidorion 24. Okt 2006 16:05

Re: Case Frage
 
Das raffinierte dabei ist, dass das zero-flag gesetzt wird, sobald der Register bei einer Operation Null wird. Das passiert automatisch und kostet keinen Befehl Microcode. Darüber hinaus gibt es kaum einen Befehl mit kürzerem Microcode, als JZ (Springe, wenn Zero-Flag gesetzt ist).
Man nutzt hier sozuzagen die Tatsache aus, dass verschiedene Befehle innerhalb der CPU unterschiedlich schnell verarbeitet werden.
Bei einem Vergleich von zwei Konstanten müsste die zweite erst in ein zweites Register geladen werden, und dann ein JE (Springe, wenn Register gleich) ausgeführt werden. Der JE macht im Microcode auch nix anderes, als die zweite von der ersten abzuziehen und ist genauso umfangreich wie die beiden Befehle im ersten Fall (DEC und JZ). Hierzu kommt dann noch bei jedem Case das Laden der Vergleichskonstante.

Phantom1 24. Okt 2006 16:29

Re: Case Frage
 
Ich wüsste auch gern mal warum das nicht geht, immerhin hat es ja früher in turbo pascal funktioniert!

mfg

Sidorion 24. Okt 2006 16:40

Re: Case Frage
 
Ganz sicher nur für Char, und das ist ein Ordinal.

Muetze1 24. Okt 2006 17:31

Re: Case Frage
 
Zitat:

Zitat von Phantom1
Ich wüsste auch gern mal warum das nicht geht, immerhin hat es ja früher in turbo pascal funktioniert!

Wie bitte? Höchstens mit einem Zeichen eines Strings, aber nicht mit einem gesamten (heutigen) ShortString.

/EDIT: Sidorion's Aussage übersehen. Er sagt ja schon das gleiche aus.

allgemein:
Wenn du eine Case Schleife mit mehreren Werten machst, dann baut sich der Compiler dazu eine Sprungtabelle. d.h. er bringt den Wert auf die Basis 0 und multipliziert ihn mit 4 (bzw. shl 2) um dann den entstandenen Wert als Offset in einer Tabelle mit Sprungadressen nutzen um die richtige Adresse zu ermitteln und dann dort hin zu springen. Dies ist eleganter und schneller als ständig mit Bedingungsabfragen bestimmte Anweisungen zu überspringen und sich so einer Bedingungsliste durch zu hangeln. Dies ist Geschwindigkeits- und Grössenoptimierter Code.

Wie sollte er sowas mit Strings bauen, wenn du niemals einen Ordinalen Typen hast den du zu einer solchen Adressierung benötigst. Bei Strings müsste er jeden einzelnen String an sich vergleichen um dann zu entscheiden ob er springt oder nicht. Dies fällt bei einer Sprungtabelle weg, da der Offset die Sprungadresse bestimmt und gleichzeitig der zu untersuchende Wert ist. Damit wird eine Abfrage des Wertes an sich unnötig.

Nachteile der Sprungtabelle: Wenn du "Lücken" in deinen Zweigen hast bzw. diese nicht aufsteigend sind, dann können Sprungtabellen nicht angewendet werden bzw. haben dadurch mehr Code bzw. Overhead, so dass es sich nicht mehr lohnt (Vorteil ist zu gering gegenüber dem alten Weg). Anderer Punkt: Die Grenzen des Ordinaltyps müssen vorher abgefragt werden, da er sonst schliesslich in's Nirvana springen würden, wenn die Sprungtabelle verlassen würde bei der Adressierung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 Uhr.
Seite 2 von 2     12   

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