AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Case Frage

Ein Thema von Nicodius · begonnen am 9. Jun 2004 · letzter Beitrag vom 24. Okt 2006
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#11

Re: Case Frage

  Alt 9. Jun 2004, 19:34
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?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#12

Re: Case Frage

  Alt 24. Okt 2006, 16:05
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.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#13

Re: Case Frage

  Alt 24. Okt 2006, 16:29
Ich wüsste auch gern mal warum das nicht geht, immerhin hat es ja früher in turbo pascal funktioniert!

mfg
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#14

Re: Case Frage

  Alt 24. Okt 2006, 16:40
Ganz sicher nur für Char, und das ist ein Ordinal.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#15

Re: Case Frage

  Alt 24. Okt 2006, 17:31
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 11:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz