Zitat von
Nailor:
Allerdings habe ich immer gedacht, dass Schleifen intern anders funktionieren, und Luckies Gebastel daher eh nicht funktioniert.
Luckies Code funktioniert, da ein Borland Mitarbeiter des Compiler-Teams diesen Spezialfall bedacht hat und dem Code-Optimierer dieses beigebracht hat. Was der Compiler in diesem Fall erzeugt ist eine nicht optimierte for-Schleife, bei der die Manipulation ohne Folgen (Endbedingung ausgeschlossen) möglich ist.
Zitat von
d3g:
Wenn der Optimierer Lust dazu hat, ist das auch so. Dann wird das CX-Register als Schleifenvariable benutzt und der Sprung funktioniert mit dem LOOP-Befehl statt mit einem CMP- und einem JZ-Befehl (braucht 3 Takte weniger).
Das war mal zu 386-Zeiten so. Beim 486 ist der LOOP Befehl im Vergleich zu "
DEC, JZ" eine lahme Schnecke. Selbst ein "CMP, JE" ist auf einem Pentium schneller. Dadurch ist es egal ob nun das ECX Register oder ein anderes freies als Zähler benutzt wird, was der Delphi-Compiler sich auch zu Nutze macht.
Noch eine Idee für die for-Schleife mit einem Step:
Delphi-Quellcode:
var
i, ii: Integer;
begin
for ii := 0 to (Count div 2 - 1) do
begin
i := ii * 2; // => SHL ist nicht gerade langsam
// hier mit i arbeiten
end;
end;