Tja, die Codeoptimierung
Weiter Alternative:
Tricks die Optimierung einfach selber mit 'ner "sinnlosen" Abfrage aus, wo du I direkt verwendest. ^^
if I = 0 then ;
I wird ja nicht wirklich benötigt, daher versucht der Compiler dieses rauszulösen.
for i := 0 to 3 do wird so schnell mal in ein
for i := 3 to 0 do umgewandelt
Kannst es dir ja selber mal bei folgendem einfachem Code ansehn (siehe CPU-Ansicht):
Delphi-Quellcode:
for i := 0
to 3
do
Beep;
// unoptimiert
asm
mov word ptr [ebp-x], 0
@1:
call Beep
inc word ptr [ebp-x]
cmp word ptr [ebp-x], 4
jne @1
end;
// optimiert
asm
mov word ptr [ebp-x], 4
@1:
call Beep
inc word ptr [ebp-x]
// << dieses stammt wohl noch aus der nicht optimierten Variante
dec word ptr [ebp-x]
// und wie man sieht wird dadurch nicht mehr runtergezählt
jnz @1
// inc + dec = 0
end;
Und hiernochmal speziell mit deiner ersten Schleife:
Delphi-Quellcode:
for I := 1
to C1
do
begin
Edit1.Text := C[I];
Edit1.Refresh;
Sleep(500);
end;
// nicht optimiert
I := 0;
repeat
Edit1.Text := PString(@C + i * SizeOf(
String))^;
Edit1.Refresh;
Sleep(500);
Inc(I);
until I = 4;
// oder leicht/nicht optimiert
I := 0;
PTemp := @C;
repeat
Edit1.Text := PTemp^;
Edit1.Refresh;
Sleep(500);
Inc(I);
Inc(PTemp, SizeOf(
String));
until I = 4;
// optimiert
I := 4;
PTemp := @C;
repeat
Edit1.Text := PTemp^;
Edit1.Refresh;
Sleep(500);
//Inc(I); << hier wieder die zuviele Zeile bei der Optimierung
Inc(PTemp, SizeOf(
String));
Dec(I);
until I = 0;
Tja, da hatt Delphi wohl wirklich ein Problem,
(is aber schon länger bekannt)
aber wie du sieht, kannst du dieses leicht umgehen, indem du einfach dem Compiler sagst, daß du angeblich das I benötigst.
PS: 's sollte schon ein paar uralte Beiträge von mir zu soeinem Phänomen geben.
Hab damals versucht die Schleifenvariable in
ASM zu verwenden, wo mich das Rückwärtszählen überraschte.
Delphi-Quellcode:
for i := 0
to 3
do
begin
...
asm
...
mov eax, &i
...
end;
...
end;