Deklaration und Definition von Variablen "vor Ort"



  • Hallo,

    in C++ kann (oder soll) man die Variablen erst anlegen wenn sie gebraucht werden. Wenn ich die Variable aber nun in einer Schleife brauche, z.B.:

    x = 0;
    do
     {
     ...
     int Var;
     Var = XY;
     ...
     } while( x < 100 );
    

    Ist das in C++ so i.O., oder definiere ich die Variable im ausführbaren Programm dann auch 100 mal ?

    Danke und Gruß

    WoWe



  • Var würde trotzdem nur einmal im Schleifendurchlauf existieren. Weil Var am Ende der Schleife (dem Gültigkeitsbereich der Schleife) zerstört werden würde (besser gesagt vom Stack fliegt). Am Anfang der Schleife wird sie auf dem Stack neu angelegt.



  • Hallo Artchi,

    vielleicht hab ich mich da falsch ausgedrückt. Das die Variable nicht 100 mal auf dem Stack angelegt wird ist mir schon klar, aber wird evtl. (bei großen Schleifen) das ausführbare Programm dadurch langsamer, im Gegensatz dazu wenn die Variable ausserhalb der Schleife angelegt wird, oder anderst gesagt, wird durch das 100malige (int Var;) im ausführbaren Programm redundanter Code erzeugt ?



  • Artchi schrieb:

    Var würde trotzdem nur einmal im Schleifendurchlauf existieren. Weil Var am Ende der Schleife (dem Gültigkeitsbereich der Schleife) zerstört werden würde (besser gesagt vom Stack fliegt). Am Anfang der Schleife wird sie auf dem Stack neu angelegt.

    Wirklich? Ich dachte eigentlich, dass das gewissermaßen "rausoptimiert" wird, sodass die Variable nur ein einziges Mal auf dem Stapel angelegt wird und ledlich neu initialisiert wird.



  • WoWe schrieb:

    aber wird evtl. (bei großen Schleifen) das ausführbare Programm dadurch langsamer, im Gegensatz dazu wenn die Variable ausserhalb der Schleife angelegt wird

    Ja, das ist durchaus möglich. Bei primitiven Typen, wie in deinem Fall, eher unwahrscheinlich, da der Compiler hier gur optimieren kann. Bei komplexeren Objekten sollte man aber in Betracht ziehen, diese ausserhalb der Schleife zu definieren, damit sie innerhalb der Schleife nicht immer wieder neu erzeugt werden.



  • variablen eigentlich immer so lokal wie möglich machen.
    seltene ausnahmen, wie std::string in einer leseschleife.

    dem compiler fällt es viel leichter, im zuge der optimierung die variable doch heimlich vor der schleife anzulegen, statt eine variable mit langer lebensdauer zwischenduch wegzumachen. außerdem landen lokale variablen gerne in registern, was speed bringt. und fehler mit uninitialisierten variablen vermeidet man auch so.



  • Konrad Rudolph schrieb:

    Wirklich? Ich dachte eigentlich, dass das gewissermaßen "rausoptimiert" wird, sodass die Variable nur ein einziges Mal auf dem Stapel angelegt wird und ledlich neu initialisiert wird.

    Ja, das ist ja dann aber vom Compiler abhängig. Ich habe das erklärt, was ich da sehe. Wenn der Compiler das wegoptimiert (was heute hoffentlich normal ist) ist das eine andere Geschichte.


Anmelden zum Antworten