frage zu folgendem code
-
Hmmm sollte ein Compiler in der entsprechenden Optimisierungsstufe solche sinnlose Schleifen erkennen und eliminieren? Eine etwas philosophische Frage

-
Azrael, il Meraz schrieb:
Hmmm sollte ein Compiler in der entsprechenden Optimisierungsstufe solche sinnlose Schleifen erkennen und eliminieren? Eine etwas philosophische Frage

Nein, da es eine Endlosschleife ist.
Wenn es sich aber um eine Schleife mit einer klaren Abbruchbedingung handelt, und die Schleife tut garnix, dann sollte ein Compiler die möglichst komplett eliminieren. Was auch einige Compiler ganz gut hinbekommen.
-
hm... ist der Aufruf von abort in der abstrakten Maschine beobachtbar? Das wäre evtl. eine Alternative.
-
Ja - wenn der Nutzer die endlosschleife wirklich ausführen will, dann macht das natürlich keinen sinn, sie wegzuhauen. Ich denke aber (das ist nur meine Meinung
), dass bei höheren Optimierungsstufen so etwas wie diese Schleife wegoptimiert werden sollte, da:- Sie liest und schreibt keine Variablen außerhalb ihres Scopes
- Sie macht keine function calls
- Sie macht eigentlich ziemlich garnichts, außer eben runden im Prozessor zu drehen.

Und warum sollte man eine Endlosschleife haben wollen, die absolut nichts macht?
Das einzige was ich mir vorstellen könnte ist sich aus Neugier die Disassembly anzuschauen aber das könnte man dann ich niedrigeren Optimierungsstufen machen. Naja man muss mit mir nicht einverstanden sein :D.
-
Eine Endlosschleife macht sehr wohl etwas und zwar verhindert sie, dass der nachfolgende Code ausgeführt wird.
-
Nanyuki schrieb:
Eine Endlosschleife macht sehr wohl etwas und zwar verhindert sie, dass der nachfolgende Code ausgeführt wird.
Gibts da nicht auch bessere Methoden?

vllt auch eine Schleife. aber eine die nur dann endlos wird, wenn man den code danach wirklich nicht mehr ausführen will. Aber dann ist das keine fest einprogrammierte endlosschleife.Ich mein - meine Einstellung ist vllt etwas schwachsinnig, schließlich sollte der vom Compiler erzeugte maschinencode auch das tun, was von ihm verlangt wird. Das sehe ich auch so.
Aber das mit einer fest einprogrammierten Endlosschleife lässt mich irgendwie nicht in ruh

-
Ich hab auch schon Endlosschleifen zu Debugzwecken o.ä. genutzt... vielleicht weil for(;;); kürzer als Sleep mit Parameter war.
Der Compiler darf das Verhalten des Programms durch Optimierungen nicht verändern. D.h. sowas wie for (int i=0;i<1<<30;i++); könnte er mit dem Argument wegoptimieren, dass die Schleife sowieso irgendwann fertig geworden wäre. Er hat dem lediglich etwas auf die Sprünge geholfen. for(;;); wird dagegen nie fertig und blockiert die weitere Ausführung des Programms. Wenn er die wegoptimiert, dann ändert sich das Programmverhalten.
-
Nanyuki schrieb:
sowas wie for (int i=0;i<1<<30;i++);
ich dachte, sowas wird schon von manchen compilern wegoptimiert. beispiel:
// test.cpp const int max = 1000000000; int main() { for(int i = 0; i < max; ++i); }:~/tmp$ g++ -O3 test.cpp ; time ./a.out; g++ -O2 test.cpp ; time ./a.out ; \ > g++ -O1 test.cpp ; time ./a.out ; g++ -O0 test.cpp ; time ./a.out ; g++ test.cpp ; time ./a.out real 0m0.002s user 0m0.000s sys 0m0.000s real 0m0.002s user 0m0.000s sys 0m0.000s real 0m0.002s user 0m0.000s sys 0m0.000s real 0m4.423s user 0m4.412s sys 0m0.000s real 0m4.441s user 0m4.396s sys 0m0.016sd.h. ab -O1 haut er die schleife weg
-
labert net drumherum er hat gefragt was
while(1) int i = 0;macht, im grunde genommen tut es nicht viel da while auf 1 gesetzt wurde was heisst das er die whileschleife immer wieder macht bis er behindert wird und reserviert immer wieder speicher an der gleichen addresse womit der vorher reservierte speicher wieder ersetzt wird punkt
-
FreakY<3Cpp schrieb:
im grunde genommen tut es nicht viel da while auf 1 gesetzt wurde
Nicht ganz. While ist keine Variable, also kann man es nicht "setzen".
FreakY<3Cpp schrieb:
was heisst das er die whileschleife immer wieder macht bis er behindert wird
Auch hier hättest du dich sorgfältiger ausdrücken können.
FreakY<3Cpp schrieb:
und reserviert immer wieder speicher an der gleichen addresse
Wieso bist du dir da so sicher?
FreakY<3Cpp schrieb:
womit der vorher reservierte speicher wieder ersetzt wird punkt
Mit ersetzen hat das eigentlich gesagt nicht viel zu tun (Konstruktion und Destruktion wäre da schon eher was).
FreakY<3Cpp schrieb:
labert net drumherum
Jaja... Lieber etwas "labern" als sich unverständlich und falsch ausdrücken. Ausserdem kann sich eine Diskussion weiterentwickeln.