![]() |
kniffliges Rätsel - Compileroptimierung
Hallo alle...
...erst mal, das Konstrukt stammt nicht von mir:thumb:
Delphi-Quellcode:
Frage: warum wird das mit X gekennzeichnete wegoptimiert.
function bla: Boolean
begin Result:= False for i = 0 to 10 do begin if blabla then exit; if blabla1 then exit; //X end; Result:= True; end ...bitte keine doofen Fragen. Ich muß mich damit quälen. Ist auch schon umgestellt. 8-) |
AW: kniffliges Rätsel - Compileroptimierung
weil blablaimmer true ergibt, oder blabla1 nie true ergibt ?
|
AW: kniffliges Rätsel - Compileroptimierung
Das kann man auch so schreiben:
Delphi-Quellcode:
Dadurch dass das Result (CPU-Register AX) nicht von Anfang an belegt wird,
function bla: Boolean
begin for i = 0 to 10 do begin if blabla or blabla1 then Exit(False); // entspricht Result:=False; Exit; end; Result:= True; end kann der Kompiler (falls er smart genug ist) das Register für Zwischenergebnisse benützen. |
AW: kniffliges Rätsel - Compileroptimierung
Sooo... endlich wieder ne vernünftige Tastatur unter den Fingern...:thumb:
In der Schleife wird ein String Zeichenweise geprüft. BlaBla und BlaBla1 sind Funktionen die auf vorhandene Zeichen prüfen. Diese funktionieren. Entweder True oder False. PS: Dieses Phänomen habe ich auch schon an anderer Stelle, anderem Zusammenhang gesehen. Dabei betrifft das immer das letzte Exit. selbst ein begin/end Block ändert nix. Nur wenn man vor das letzte Exit im Block noch einen sinnlosen Befehl schreibt wird das Exit mit einkompilliert. Merkwürden...:roll: |
AW: kniffliges Rätsel - Compileroptimierung
Müsste man doch im Assembler sehen
Delphi-Quellcode:
Wäre es denkbar, das die For-Schleife so optimiert wird?
i := 0;
1: if i>10 then goto 2; if blabla then exit inc(i); if not blabla1 then goto 1; 2: |
AW: kniffliges Rätsel - Compileroptimierung
:lol: Was willst du im Assembler sehen wenn das Exit nicht eincompiliert ist ? Ich habe einen, der das versteht, gucken lassen... Nach dem letzten Vergleich gehts direkt weiter.
|
AW: kniffliges Rätsel - Compileroptimierung
Zitat:
|
AW: kniffliges Rätsel - Compileroptimierung
Es war soviel zu sehen, daß das BlaBla1 True war und normalerweise der nächste Befehl das Exit sein sollte, was einfach nicht da war. Auch in der IDE konnte man keinen Breakpoint auf das Exit setzen. Kein Blauer Punkt und ungültiger Breakpoint.
Ich weis schon warum ich darum einen Bogen mache...:zwinker: |
AW: kniffliges Rätsel - Compileroptimierung
Ich verstehe Dein Problem nicht:
Code:
Man könnte bemängeln, daß der Debugger nicht ordentlich funktioniert, mit optimieren hat das aber meiner Meinung nach nichts zu tun.
call blabla
test al,al jnz +$18 ; spring nach ende entspricht exit ... call blabla1 test al,al jnz +$08 ; spring nach ende entspricht exit ... xor eax,eax ;hier ist ende pop ecx ... Gruß K-H |
AW: kniffliges Rätsel - Compileroptimierung
Zitat:
Delphi-Quellcode:
keine blauen Punkte zum Markieren eines Haltepunkts.
Exit
So bekommt man die aber doch (ich habe jetzt nur mal ein WriteLn dazu geschrieben)
Delphi-Quellcode:
function bla: Boolean
begin Result:= False for i = 0 to 10 do begin if blabla then begin WriteLn; exit; end; if blabla1 then begin WriteLn; exit; //X end; end; Result:= True; end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:39 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