Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Compiler optimiert nicht richtig (https://www.delphipraxis.net/86322-compiler-optimiert-nicht-richtig.html)

igel457 12. Feb 2007 17:05


Compiler optimiert nicht richtig
 
Hallo,

ich habe ein komisches Problem mit dem Compiler. Und zwar wird bei folgendem Code einiges wegoptimiert:

Delphi-Quellcode:
for i := 0 to FEngine.FList.Count - 1 do
begin
  FEngine.FList[i].Collision2;
  FEngine.CollisionDone := true;
  if FEngine.CollisionDone then
  begin
    break; <--- Diese Zeile wird nicht compiliert
  end;
end;
Kann ich mir irgendwo eine "Begründung" her holen? Oder hatte schonmal jemand ähnliche Probleme?
CollisionDone ist ein Property und folgendermaßen Deklariert:
Delphi-Quellcode:
property CollisionDone:boolean read FCollisionDone write FCollisionDone;
Danke für eure Hilfe,
Igel457

Nicolai1234 12. Feb 2007 17:11

Re: Compiler optimiert nicht richtig
 
Was soll die Zeile denn bewirken?
Also jetzt konkret auf das Programm bezogen?

Irgendwie verstehe ich den Sinn der ganzen Sache noch nicht so..

Elvis 12. Feb 2007 17:12

Re: Compiler optimiert nicht richtig
 
Zitat:

Zitat von igel457
ich habe ein komisches Problem mit dem Compiler. Und zwar wird bei folgendem Code einiges wegoptimiert:

Was steht hier?
Delphi-Quellcode:
for i := 0 to FEngine.FList.Count - 1 do
begin
  FEngine.FList[i].Collision2;
  FEngine.CollisionDone := true;
  if FEngine.CollisionDone then
  begin
    break; <--- Diese Zeile wird nicht compiliert
  end;
end;
Das steht da:
Delphi-Quellcode:
if Engine.List.Count > 0 then
begin
  Engine.List[0].Collision2;
  Engine.CollisionDone := true;
end;
btw: Warum benutzt du überall die Felder direkt? Eine property, die mit dem Feld als read-clause deklariert wird, hat keinerlei Overhead gegenüber dem Feld direkt.
Aber auf der anderen Seite hast du später die Möglichkeit den Getter zu ändern. Außerdem sehen die ganzen FXXX furchtbar hässlich aus. ;)

igel457 12. Feb 2007 17:22

Re: Compiler optimiert nicht richtig
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Elvis
Das steht da:
Delphi-Quellcode:
if Engine.List.Count > 0 then
begin
  Engine.List[0].Collision2;
  Engine.CollisionDone := true;
end;

Irgendwie verstehe ich dich jetzt nicht richtig. Ich hänge mal ein kleines Bild von meinem Problem an. Das zweite Break habe ich nur zu Demonstrationszwecken eingefügt.

Ich suche jetzt schon seit Stunden nach dem Fehler...

Mit der direkten verwendung der Felder kommt das noch vom DelphiX. Ich habs umgeändert...

BenjaminH 12. Feb 2007 17:32

Re: Compiler optimiert nicht richtig
 
Das wird wegoptimiert, weil der Fall nie eintritt. Ganz einfach deshalb weil du direkt vor der Abfrage selbst dafür sorgst, dass es immer true ist. Genauso, wie Elvis das schon geschrieben hat.

igel457 12. Feb 2007 17:37

Re: Compiler optimiert nicht richtig
 
Diese Zeile mit dem True habe ich nur zum Testen hinzugefügt.
Allerdings funktioniert es Anscheinend doch richtig (also auch ohne dieses CollisionDone = true), obwohl die Zeile nie Ausgeführt wird. :gruebel:
Der Fehler den ich habe scheint doch wo anders her zu kommen... Ich wollte halt einen Haltepunkt auf diese Zeile setzen und war geschockt als ich gesehen habe, dass diese nicht ausgeführt wird.

Elvis 12. Feb 2007 17:43

Re: Compiler optimiert nicht richtig
 
Zitat:

Zitat von igel457
Der Fehler den ich habe scheint doch wo anders her zu kommen... Ich wollte halt einen Haltepunkt auf diese Zeile setzen und war geschockt als ich gesehen habe, dass diese nicht ausgeführt wird.

Deshalb deaktiviert man beim Debugging ja auch die Optimierungen.
Und ein Rebuild anstatt einem Recompile wirkt manchmal wahre Wunder. Besonders nach Änderung der Compiler-Optionen ist es zwingend notwendig einen Rebuild aller Dateien zu machen, die davon betroffen sind.
Optimierungen ausschalten und dann F9 oder Ctrl F9 drücken ist also 'ne Luftnummer. :zwinker:

Die Optimierungen des Compilers sind normalerweise nicht destruktiv, soll heißen er ändert nicht wirklich etwas an deinem Programmfluss, er wirft nur Dinge raus, die unnötig sind, fasst Operationen zusammen oder ändert die Reihenfolge von Operationen wenn es keinen Einfluss auf das Programm hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 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