Mein Lehrer hat mir einmal gesagt, dass ich keine Variable innerhalb einer Schleife definieren soll , aber ich verstehe ehrlich gesagt immer noch nicht warum.
Was sind die Nachteile davon?
Könnte mir jemand das erklären?
c++
programming-practices
performance
initialization
declarations
user3260672
quelle
quelle
const
Gründen ziehe ich es vor, meine Variablen zu deklarieren, es sei denn, es gibt einen Grund, dies nicht zu tun (eine Gewohnheit der funktionalen Programmierung). Entweder ich werde sie nicht ändern und das Optimierungsprogramm sollte erkennen, wenn sie nicht benötigt werden, oder ich werde und ich habe einen schwerwiegenden Fehler verhindert. Wenn diese konstanten Zwischenwerte für eine Iteration der Schleife spezifisch sind, bedeutet dies, dass sie innerhalb der Schleife deklariert werden. Ein anderes Mal, wenn Sie Variablen außerhalb der Schleife deklarieren müssen, müssen Sie sie außerhalb der Schleife referenzieren. Zum Beispiel die Ergebnisse, die Sie speichern.Antworten:
Es ist kein Problem , eine Variable innerhalb einer Schleife zu definieren . In der Tat ist es eine gute Praxis, da Bezeichner auf den kleinstmöglichen Bereich beschränkt sein sollten.
Schlecht ist es , eine Variable innerhalb einer Schleife zuzuweisen, wenn Sie sie auch einmal zuweisen könnten, bevor die Schleife ausgeführt wird. Je nachdem, wie komplex die rechte Seite der Zuweisung ist, kann dies ziemlich teuer werden und sogar die Laufzeit der Schleife dominieren. Wenn Sie eine Schleife schreiben, die in allen Iterationen denselben berechneten Wert verwendet, sollten Sie sie unbedingt über der Schleife berechnen - das ist wichtiger als die Minimierung ihres Umfangs.
Zur Verdeutlichung: Solange
compute()
immer derselbe Wert zurückgegeben wird, ist diesist schlauer als das:
quelle
1/1/1900
, die Variable deklariert werden sollte und der Wert vor der Schleife zugewiesen werden sollte.Komplexe Typen haben nicht triviale Konstruktoren und Destruktoren.
Diese werden am Anfang und Ende des Schleifenkörpers aufgerufen (wenn er initialisiert wird und den Gültigkeitsbereich verlässt). Wenn die Initialisierung teuer ist und Speicherplatz benötigt, sollte dies vermieden werden.
Für Trivialtypen ist dies jedoch kein Problem. Die Zuweisung und Freigabe selbst addiert und subtrahiert lediglich einen Wert vom Stapelzeiger. (was optimiert wird)
quelle
Nun, sein Rat ist etwas zu einfach (das ist eine Untertreibung).
Das Folgen reicht von einer guten Idee über wen kümmert es und eine schlechte Idee bis hin zu unmöglich .
Sie sollten es befolgen, wenn die Wiederverwendung billiger ist als die Zerstörung der alten und die Erstellung einer neuen.
Sie sollten es als eine Frage des Stils meiden, wenn es für die Leistung keine Rolle spielt.
Sie sollten es wirklich meiden, wenn es schlechtere Leistung oder die falsche Semantik hat.
Sie können es nicht befolgen, wenn der verwendete Typ weder das Vertauschen noch die Zuweisung von Verschiebungen oder Kopien zulässt.
quelle
for (std::string s; std::cin >> s;) ...
zu "außerhalb" geändert werden und immer noch "außerhalb" sein