frage zu folgendem code



  • oder ist das gleiche wie i = 3

    Wenn du dich jetzt fragst, ob du i besser (Performance) in einen äusseren Bereich schafst, dann lass da lieber die Finger davon. Variablen sollten immer so tief, wie möglich gehalten werden. Und was noch dazu kommt ist, dass es bei POD (siehe FAQ), keine Rolle spielt, ob du eine Zuweisung hast, oder eine Deklaration, da kein Konstruktor aufgerufen wird.



  • ... und bei dem Beispiel i eh immer an der gleichen Stelle im Speicher liegt.



  • Fellhuhn schrieb:

    ... und bei dem Beispiel i eh immer an der gleichen Stelle im Speicher liegt.

    ...was de facto so sein mag, vom Standard garantiert wird es allerdings nicht. Mal abgesehen davon könnte ein Compiler versuchen, die Anzahl der Sprünge zum loop-Anfang zu reduzieren indem er den loop-Code mehrfach hintereinander legt. Dann könnte es entsprechend auch das i mehrfach im Speicher geben.



  • Er könnte auch die ganze Schleife einfach wegoptimieren. 😉



  • Die Schleife selbst eher nicht, aber die Variableninitialisierung schon.



  • 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.


  • Mod

    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:

    1. Sie liest und schreibt keine Variablen außerhalb ihres Scopes
    2. Sie macht keine function calls
    3. 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.016s
    

    d.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.


Anmelden zum Antworten