![]() |
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 |
AW: kniffliges Rätsel - Compileroptimierung
Bei
Delphi-Quellcode:
mit Anweisung in nächster Zeile sind die "blauen Punkte" oft nicht als Haltepunkt zu gebrauchen, weil sie komplett in der ersten Zeile arbeiten, das ist schon ewig so.
if then
Bemängeln würde ich dies nicht, weil spätestens beim QA-Audit das
Delphi-Quellcode:
zu einem
if x then dosomething;
Delphi-Quellcode:
würde/sollte (und das funktioniert bei mir im Debugger immer).
if x then begin dosomething; end;
Zumindest bei uns ist das Pflicht, und ich glaube die QA-Audits, die Delphi anbietet (evtl. erst ab der Enterprise? bei mir sind die Menüpunkte gerade ausgegraut, verwende aber auch nur noch die Pro), bemängeln ein
Delphi-Quellcode:
ohne
if then
Delphi-Quellcode:
ebenfalls.
begin end;
|
AW: kniffliges Rätsel - Compileroptimierung
Zitat:
Delphi-Quellcode:
gibt es auch keine blauen Punkte ;)
if foo then
begin Exit; end; |
AW: kniffliges Rätsel - Compileroptimierung
Liste der Anhänge anzeigen (Anzahl: 1)
Hmmm interessant! Das scheint ein wenig vom Kontext abhängig. Siehe Anhang.
|
AW: kniffliges Rätsel - Compileroptimierung
Moin... 8-)
Schön, daß ihr die Zeit findet Euch damit zu beschäftigen. :thumb: Interessant ist das Thema allemal. Wenn man nicht explizit drauf achtet ist mal schnell was wegoptimiert von dem man ausgeht (logischerweise) daß es funktioniert... wer achtet schon wirklich auf die blauen Punkte :zwinker: Der Knackpunkt liegt ja hier:
Delphi-Quellcode:
zu:
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; // wird eincompiliert end; end; Result:= True; end
Delphi-Quellcode:
...das kann wahrscheinlich nur der Programmierer der Optimierung des Compilers beantworten. :zwinker:function bla: Boolean begin Result:= False for i = 0 to 10 do begin if blabla then begin WriteLn; exit; end; if blabla1 then begin exit; // wird nicht eincompiliert end; end; Result:= True; end |
AW: kniffliges Rätsel - Compileroptimierung
Es geht auch ohne das
Delphi-Quellcode:
, z.B. mit einem expliziten Returnwert.
WriteLn
Delphi-Quellcode:
Oder sobald Exception-Handling in's Spiel kommt:
function bla: Boolean;
begin Result := false; for i := 1 to 10 do begin if i = 5 then begin Exit; end; if foo then begin Exit(false); // hier gibt es eine Haltpunktmöglichkeit end; end; Result := true; end;
Delphi-Quellcode:
So oder so, wegoptimiert ist der Code nicht, sondern lediglich im Debugger nicht als Breakpoint verwendbar.
function bla: Boolean;
begin Result := false; try for i := 1 to 10 do begin if i = 5 then begin Exit; end; if foo then begin Exit; // hier gibt es eine Haltpunktmöglichkeit end; end; Result := true; except Result := false; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 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