AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Achtung. Optimierung beim Compiler

Ein Thema von DelTurbo · begonnen am 8. Jun 2010 · letzter Beitrag vom 11. Jun 2010
Antwort Antwort
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.245 Beiträge
 
Delphi 2007 Architect
 
#1

AW: Achtung. Optimierung beim Compiler

  Alt 10. Jun 2010, 16:59
Optimiert hat i den wert 88 nach der schleife. i wird runtergezählt.
Nicht Optimiert hat i den wert 3. i wird hochgezählt.

i ist im weiteren verlauf mein index auf ein anderes Array.

Na wenn das mal kein unterschied ist, weiss ich es nicht.

Edit: Das die bilder sooooo klein sind wusste ich nicht. Man kann es trotzdem lesen.
@uligerhardt, wenn ich ohne den debugger den fehler nicht gehabt hätte, hätte ich wohl kaum gesucht.
Angehängte Grafiken
Dateityp: jpg Optimiert.jpg (31,6 KB, 22x aufgerufen)
Dateityp: jpg NichtOptimiert.jpg (32,9 KB, 20x aufgerufen)
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!

Geändert von DelTurbo (10. Jun 2010 um 17:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Achtung. Optimierung beim Compiler

  Alt 10. Jun 2010, 17:12
Optimiert hat i den wert 88 nach der schleife. i wird runtergezählt.
Nicht Optimiert hat i den wert 3. i wird hochgezählt.

i ist im weiteren verlauf mein index auf ein anderes Array.

Na wenn das mal kein unterschied ist, weiss ich es nicht.

Edit: Das die bilder sooooo klein sind wusste ich nicht. Man kann es trotzdem lesen.
@uligerhardt, wenn ich ohne den debugger den fehler nicht gehabt hätte, hätte ich wohl kaum gesucht.
Eigentlich hätte eine Warnung auftauchen müssen,daß das I nach dem Schleifendurchlauf undefiniert ist.
Hast Du vielleicht die Warnungen unterdrückt?
Ist mir auch einmal passiert, und danach hab ich "for i:=" durch "while i=" ersetzt.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#3

AW: Achtung. Optimierung beim Compiler

  Alt 10. Jun 2010, 17:40
Hallo,

i ist im weiteren verlauf mein index auf ein anderes Array.
p80286 und himitsu haben absolut recht: Der Wert der Schleifenvariable ist nach der Schleife nicht garantiert, egal was Du machst. Um die Eingangsfrage zu beantworten: Ja, das Verhalten ist bekannt.

Die Herren Nick Hodges, Allen Bauer und Primoz Gabrijelcic schreiben es bei StackOverflow so:

Zitat:
That is correct. The variable is specifically documented to be undefined after the loop is complete. If you need a defined variable after the loop, use while or repeat – Nick Hodges Apr 9 at 22:45

Depending upon how the loop variable is used within the loop, the compiler may even eliminate it completely and simply use a pointer to iterate through the elements of an array, for example. – Allen Bauer Apr 10 at 0:02

... is undefined ... except if you terminate the loop with the 'break' statement. In that case, value is defined (the last value the loop counter had before the 'break' was executed). – gabr Apr 10 at 5:57
Der Sonderfall Break bzw. Exit wird von Gabrijelcic angerissen, in der Delphi Hilfe bzw. Daniels Delphi Referenz darauf wird das im Detail erörtert.

Gruß,
Assertor
Frederik
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.245 Beiträge
 
Delphi 2007 Architect
 
#4

AW: Achtung. Optimierung beim Compiler

  Alt 10. Jun 2010, 19:15
Hi,

Warnungen sind an. Nein es kommt keine warnung. Sonst hätte ich nicht suchen müssen sondern sofort gewusst was schief läuft.

Lasse ich die Optimierung an und mache zusätlich ein WriteLn(i); rein hat i auchwieder den "richtigen" wert. Da kann man dann auch schön sehen das die Optiemierung nicht gut ist. Statt es weiterhin in einem register zu machen, was beim call kurz gepusht wird, sieht der code aus als wäre er nicht optimiert.

Ich habe grad mal einen 3zeiler gemacht. Es kommt keine warung. Kann ja jeder mal durchjagen, der möchte.

Zum testen ob ich Hinweise und Warungen bekomme, (ich habe auch nun mind. 3x nachgesehen, die hacken sind drinn) hatte ich in dem Projekt noch i1 drinne und wollte das ausgeben. Da kommt denn ein Hinweis das es nicht initialisiert wurde.

Ich habe übrigens nicht D2005 sondern D7. Ob das eine rolle spielt weiss ich nicht. Mit dem neuen Board hier sieht man wohl nichtmehr welche version jemand nuzt. Und D7 kann man nicht einstellen.

EDIT:
Um die Eingangsfrage zu beantworten: Ja, das Verhalten ist bekannt.
Das wusste ich nicht. Da ich ja blutiger anfänger bin und mich kaum im netz rumtreibe, laufen solchen speziellen info an mir vorbei.

Was ich eigentlich nur erreichen wollte ist, das nicht andere auf diese sache reinfallen. Und keines falls einen Thread erzeugen der nun 3 Seiten lang ist. Eigentlich war es nur als info gedacht.
Angehängte Dateien
Dateityp: zip Schleife.zip (3,2 KB, 10x aufgerufen)
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!

Geändert von DelTurbo (10. Jun 2010 um 19:24 Uhr)
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#5

AW: Achtung. Optimierung beim Compiler

  Alt 11. Jun 2010, 11:00
EDIT:
Um die Eingangsfrage zu beantworten: Ja, das Verhalten ist bekannt.
Das wusste ich nicht. Da ich ja blutiger anfänger bin und mich kaum im netz rumtreibe, laufen solchen speziellen info an mir vorbei.

Was ich eigentlich nur erreichen wollte ist, das nicht andere auf diese sache reinfallen. Und keines falls einen Thread erzeugen der nun 3 Seiten lang ist. Eigentlich war es nur als info gedacht.

Macht doch nichts, jeder hat mal angefangen... Aber in der DP hättest Du das auch finden können (sf Optimierung, Schleife):
http://www.delphipraxis.net/89407-co...mierung-2.html
http://www.delphipraxis.net/122117-v...definiert.html

Es soll auch im Delphi Language Guide stehen, das habe ich jetzt aber nicht nachgesehen.

Ich habe Dein Beispiel gerade getestet: Es bringt keine Warnung unter Delphi 2010. Das liegt daran, dass es ja genau der dokumentierte Sonderfall ist, den ich zuvor erwähnte (siehe aktuellere Delphi Hilfe).

Es gibt ohne Break auf jeden Fall eine Warnung:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  j: Integer;
begin
    MyArray[5]:=True;
    for i:=low(MyArray) to high(MyArray) do begin
      // if MyArray[i] then break;
      j := i;
    end;
    Label1.Caption:='i ist:'+IntToStr(i);
end;
Bringt:
Zitat:
[DCC Warning] Unit1.pas(37): W1037 FOR-Loop variable 'i' may be undefined after loop
Gruß,
Assertor
Frederik
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.245 Beiträge
 
Delphi 2007 Architect
 
#6

AW: Achtung. Optimierung beim Compiler

  Alt 11. Jun 2010, 11:15
Ich habe Dein Beispiel gerade getestet: Es bringt keine Warnung unter Delphi 2010.
Danke, das ist genau das was ich wissen wollte.
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.245 Beiträge
 
Delphi 2007 Architect
 
#7

AW: Achtung. Optimierung beim Compiler

  Alt 11. Jun 2010, 10:56
Eigentlich hätte eine Warnung auftauchen müssen,daß das I nach dem Schleifendurchlauf undefiniert ist.
Mir ging es darum. Ob andere Delphi´s eine warnung auspsucken, wie p80286 beschreibt. Diese "demo" ist nur für diesen zweck.

Es kommt keine Warning, weil du mit Break aus der Schleife gehst und daher i einen definierten Wert hat (wie oben schon zitiert wurde). Hast du kein break, wird eine Warning ausgegeben. Und in der Tat steht bei mir i dann auf 10, obwohl laut der Schleife nur von 0 bis 9 gelaufen wird.
Danke
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.387 Beiträge
 
Delphi 12 Athens
 
#8

AW: Achtung. Optimierung beim Compiler

  Alt 10. Jun 2010, 17:16
Dieses wurde doch garnicht bezweifelt?

Es wurde nur gesagt, daß die "Optimierung" das Programm-Verhalten nicht verändert,
wie du es (so klingt es zumindestens) ständig behauptest.
Und das ist bisher nirgendwo nachgewiesen wurden.

Fazit:
- intern kann sich die Zählreihenfolge mal verändern
- aber dennoch wird an der Arbeitsweise und dem Ergebnis des Programms nix verändert.


PS: Diese Optimierung muß nichtmal nur rückwärts zählen.

zählt von 6 auf 0 runter:
(natürlich nur in diesem Beispiel und mit Optimierung halbwegs garantiert)
Delphi-Quellcode:
var i, j: Integer;
begin
for i := 5 to 10 do
  inc(j);
if j = 0 then ; // damit j nicht wegoptimiert wird
end;
zählt von -6 auf 0 rauf:
Delphi-Quellcode:
var i, j: Integer;
begin
for i := 10 downto 5 do
  inc(j);
if j = 0 then ;
end;
Und falls deine Schleifenvariable nach der Schleife einen "unerwarteten" Wert aufweist ... daran bist'e selbser Schuld, da eine Schleifenvariable nur innerhalb der Schleife gültig ist, welches der Compiler (wie auch schon erwähnt wurde) melden sollte.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Achtung. Optimierung beim Compiler

  Alt 10. Jun 2010, 17:29
Dieses wurde doch garnicht bezweifelt?

Es wurde nur gesagt, daß die "Optimierung" das Programm-Verhalten nicht verändert,
wie du es (so klingt es zumindestens) ständig behauptest.
Und das ist bisher nirgendwo nachgewiesen wurden.

Fazit:
- intern kann sich die Zählreihenfolge mal verändern
- aber dennoch wird an der Arbeitsweise und dem Ergebnis des Programms nix verändert.
Danke. Du hast das irgendwie prägnanter formuliert als ich.
Uli Gerhardt
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:16 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