Variable in Scope von Schleife neu deklarieren oder nur zuweisen?



  • Was ist effektiver

    int s;
    for(int i = 0; i < 100000; ++i){
    s = i;
    }
    

    oder

    for(int i = 0; i < 100000; ++i){
    int s = i;
    }
    

    das gleiche auch bei größeren Datentypen wie strings oder so

    was ist effizienter



  • Kommt drauf an was du denn haben willst.

    Bei Variante 2 ist 's' aber nur innerhalb der Schleife verwendbar.



  • das wäre in Ordnung. Es geht nur um die Effizienz beispielsweise auch hier

    std::ifstream inputFile;
    for(int i = 0; i < 100000; ++i){
    inputFile.open("XYZ");
    ...
    inputFile.close();
    }
    

    oder

    for(int i = 0; i < 100000; ++i){
    std::ifstream inputFile("XYZ");
    }
    


  • Sewing schrieb:

    was ist effizienter

    Definiere "effizient".

    Bezogen auf die benötigten CPU-Zyklen dürften es in beiden Beispielen wohl Jacke wie Hose sein.

    Grundsätzlich gilt: messen!



  • manni66 schrieb:

    Bezogen auf die benötigten CPU-Zyklen dürften es in beiden Beispielen wohl Jacke wie Hose sein.

    Sehe ich auch so.
    Allerdings ist es aus unterschiedlichen Gründen egal, das sollte man vielleicht nicht unterschlagen.

    Im int Fall, bzw. vermutlich bei fast allem was trivial kopierbar ist (EDIT: und natürlich einen trivialen Destruktor hat!), ist es egal weil der Compiler sowieso identischen oder equivalenten Code generieren wird.

    Im fstream Fall ist es egal, weil das Öffnen eines Files typischerweise um ein vielfaches langsamer ist als die restliche Initialisierung die so ein fstream brauchen wird. (Ist aber nur ein educated guess - wenn du's genau wissen willst, wie manni66 schon geschrieben aht: messen.)

    Es gibt aber auch Klassen wo es definitiv nicht egal ist. z.b. einen std::string oder std::vector würde ich wiederverwenden. WENN es wirklich um Performance geht. Wenn Performance nicht SO wichtig ist, verwende ich grundsätzlich das was konzeptionell "richtiger" ist. Und das ist normalerweise die Variable innerhalb der Schleife zu deklarieren. Denn wenn es ohne weitere Änderungen möglich ist die Variable in die Schleife reinzuziehen, dann bedeutet das dass die Variable bei jedem Schleifendurchlauf komplett "überschrieben" wird, also nichts vom relevanten, logischen Zustand* übrig bleibt. Und damit ist es für mich konzeptionell ne neue Variable. Und wenn es nicht so ohne weiteres möglich ist, dann stellt sich die Frage mMn. gar nicht 😉

    *: Bei std::string bzw. std::vector meine ich mit "relevanter, logischer Zustand" die "Nutzdaten". Also .capacity() gehört nicht mit zu diesem relevanten, logischen Zustand.



  • Danke für diese ausführliche Antwort 🙂


Log in to reply