Werden Variablen innerhalb einer Schleife (while oder for) entsorgt, nachdem die Schleife abgeschlossen ist?
Sind Variablen, die erstellt werden, innerhalb einer while-oder for-Schleife entsorgt/aus dem Speicher gelöscht, nachdem die Schleife fertig ausgeführt? auch ist es eine schlechte Codierung Gewohnheit zu erstellen, die temporäre Variablen innerhalb einer Schleife?
in diesem Beispiel schafft es 100 X-Variablen und dann entsorgen Sie Sie, oder werden Sie entsorgt, die bei jeder iteration? danke.
Beispiel:
int cc =0;
while(cc < 100){
int X = 99; //<-- this variable
cc++;
}
"Entsorgt" im Verhältnis zu einem
Es gibt nur eine variable. Und es ist nicht unwahrscheinlich, dass es keinen gibt, kann der Optimierer kann auch speichern Sie den Wert in einem CPU-register. Es gibt keine speziellen cleanup, ist es einfach "vergisst" die variable, wenn Sie wieder das stack-pointer. Wichtig, int muss schnell sein. Beste, was zu tun zu bekommen, Einsicht ist der Blick in die Liste der assembly, die Ihr compiler generieren kann.
Entsorgt, in Kombination mit C++, ist ein eher problematischer Begriff. Es könnte bedeuten, "zerstört", aber dann sollten Sie schreiben Sie "vernichtet" und nicht "entsorgt". Oder könnte es etwas anderes meinen. In deiner Frage "etwas anderes" sein könnte: hat der compiler code generieren, wiederholt, reserviert und freigibt Speicher für die variable.
int
variable/Wert ist .. nicht sehr spannend, da keine spezielle cleanup/Vernichtung durchgeführt wird. Das einzige, was von Interesse ist in diesem Fall der Sichtbarkeit/Gültigkeitsbereich der variable.Es gibt nur eine variable. Und es ist nicht unwahrscheinlich, dass es keinen gibt, kann der Optimierer kann auch speichern Sie den Wert in einem CPU-register. Es gibt keine speziellen cleanup, ist es einfach "vergisst" die variable, wenn Sie wieder das stack-pointer. Wichtig, int muss schnell sein. Beste, was zu tun zu bekommen, Einsicht ist der Blick in die Liste der assembly, die Ihr compiler generieren kann.
Entsorgt, in Kombination mit C++, ist ein eher problematischer Begriff. Es könnte bedeuten, "zerstört", aber dann sollten Sie schreiben Sie "vernichtet" und nicht "entsorgt". Oder könnte es etwas anderes meinen. In deiner Frage "etwas anderes" sein könnte: hat der compiler code generieren, wiederholt, reserviert und freigibt Speicher für die variable.
InformationsquelleAutor Daniel Valland | 2014-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Umfang und Lebensdauer sind zwei verschiedene Dinge. Definierten Variablen in block Bereich ohne
static
, Sie sind mehr oder weniger eng miteinander verknüpft, aber Sie sind immer noch unterschiedliche Konzepte-und Sie können Schießen selbst in den Fuß, wenn Sie nicht halten Sie Sie gerade.Unter Angabe der Ausschnitt aus der Frage:
Den Umfang von
X
ist die region von Programm text, in dem Ihr name angezeigt wird. Es erstreckt sich von dem Punkt, an dem es definiert zum Ende des umschließenden Blocks, der abgegrenzt ist durch die{
und}
Zeichen. (Die Tatsache, dass der block passiert zu sein Teilwhile
- Anweisung ist nicht direkt relevant; es ist der block selbst, der definiert den Geltungsbereich.)Innerhalb des Blocks, der name
X
bezieht sich auf dieint
variable. Außerhalb des Blocks, der nameX
ist nicht sichtbar.Den Lebensdauer von
X
ist die Zeit, während der Ausführung des Programms, wennX
logisch existiert. Es beginnt bei der Ausführung erreicht die öffnung{
(vor die definition), und endet bei der Ausführung erreicht die Schließung}
. Wenn der block ausgeführt wird, 100 mal, dannX
erstellt und "zerstört" 100-mal und hat 100 disjunkte Lebenszeiten.Obwohl die Namen
X
ist nur sichtbar, innerhalb seines Bereichs, die Objekt genanntX
zugegriffen werden kann (direkt oder indirekt) zu jeder Zeit innerhalb seiner Lebensdauer. Zum Beispiel, wenn wir pass&X
um eine Funktion, so dass sich die Funktion von Lesen und aktualisieren das Objekt, obwohl die Funktion ist völlig außerhalb Ihrer Reichweite.Können Sie die Adresse
X
, und speichern Sie diese Adresse für die Verwendung nach seine Lebenszeit beendet hat-aber dadurch nicht definiertes Verhalten. Ein Zeiger auf ein Objekt, dessen Lebensdauer abgelaufen ist unbestimmten, und jeder Versuch, Sie zu dereferenzieren,--, oder sogar der Bezug zu dem Zeiger den Wert-hat nicht definiertes Verhalten.Nichts bestimmtes eigentlich zu geschehen hat, wenn ein Objekt erreicht das Ende seiner Lebensdauer. Die Sprache ist lediglich notwendig, das Objekt zu existieren, während seiner Lebenszeit; außerhalb, sind alle Wetten ab. Platz auf dem stack reserviert zu halten, das Objekt zwar aufgehoben (was in der Regel bedeutet nur, bewegen Sie den stack-pointer), oder, wie einer Optimierung der stack-Speicher bleibt zugewiesen und erneut für die nächste iteration der Schleife.
Überhaupt nicht. Solange Sie nicht speichern Sie das Objekt-Adresse über das Ende seiner Lebensdauer, und es gibt nichts falsch mit ihm. Die Reservierung und die Freigabe wird sehr oft gemacht werden bei der Einreise in und Ausreise aus der Funktion eher als block, als eine performance-Optimierung. Einschränken der Variablen auf einen relativ engen Bereich ist eine sehr gute Codierung Gewohnheit. Es macht den code leichter zu verstehen, durch die Beschränkung unnötige Interaktionen zwischen den verschiedenen teilen des Codes. Wenn
X
definiert ist, in den Körper der Schleife, die nichts außerhalb der Schleife beeinflussen können (falls du das noch nicht getan haben, etwas kompliziert), die es leichter macht, an die Vernunft über den code.UPDATE: Wenn
X
waren von einer Art, mit einer nicht-trivialen Konstruktor und/oder Destruktor, die Schaffung und Zerstörung vonX
muss tatsächlich durchgeführt werden, bei der Einreise in und der Ausreise aus dem block (es sei denn der compiler kann optimieren, dass der code Weg). Für ein Objekt vom Typint
ist das kein Problem.InformationsquelleAutor Keith Thompson
Ja, wird die variable erstellt und zerstört N Zeiten, es sei denn der compiler optimiert es irgendwie (was kann es, glaube ich). Es ist nicht eine sehr große Sache, wenn Sie nur ein
int
obwohl. Es wird noch problematischer, wenn Sie haben einige komplexe Objekt neu erstellt, 99 mal in der Schleife.Ein kleines Beispiel aus der Praxis:
In diesem code
TestClass c
neu erstellt werden 5 mal. IdeOne Demo.InformationsquelleAutor FreeNickname
Ja. Jede definierte variable innerhalb eines Bereichs
{ }
:Wird automatisch freigegeben, sobald es den Bereich verlässt.
Dies gilt auch in diesem Fall:
Den Umfang der
i
beschränkt sich auf die for-Schleife, auch wenn es nicht deklariert ist innerhalb ein paar{ }
.InformationsquelleAutor JoErNanO
Als darauf hingewiesen, vor, in Wahrheit gibt es keine Notwendigkeit, keine erstellen/zerstören eine lokale variable wiederholt.
Das ist eine unnötige Verschwendung von CPU-Zeit.
Beispiel, kompiliert mit "gcc -S -masm=intel -fverbose-asm"
die entsprechende assembly-listing ist:
Der interessante Teil liegt in der Verweise auf register RBP.
Einmal eingestellt, lässt es sich nicht ändern. Variable "i" ist immer auf [rbp-4]. (Variationen der code, mit mehr vars, etc., gab die gleichen Ergebnisse = es gibt keine wiederholten allocation/deallocation = änderungen an den stack-top-position).
Es ist das vernünftigste, was zu tun ist: denken Sie an eine Schleife, die wiederholt Billionen mal.
Wäre ein anderer compiler es anders machen? Möglicherweise ja, aber, warum auf der Erde würde es tun?
Sicherheit könnte ein Problem sein? Unwahrscheinlich; in diesem Fall sollte der Programmierer einfach überschreiben einer variable lassen, bevor es verschwindet.
InformationsquelleAutor André Koscianski
Ja
Wenn Sie wollen, haben Zugriff auf die variable nach der Schleife sollte man es erklären, auch außerhalb der Schleife
i
außerhalb der Schleifedie Lebensdauer einer viariable beschränkt sich auf den Kontext
{...}
in dem es erstellt wurdeIst, wo wir erwägen, ein Objekt der Destruktor aufgerufen werden, wenn das erreichen
}
InformationsquelleAutor Amxx
Ja, Sie werden zerstört, wenn Sie gehen out of scope. Beachten Sie, dass diese nicht-spezifischen Variablen in der Schleife. Diese Regel gilt für alle Variablen mit automatische Speicherung Dauer.
InformationsquelleAutor Pradhan
Alle Variablen bleiben aktiv im it-Bereich. Außerhalb des Geltungsbereichs, insbesondere die variable noch nicht beendet haben, vergessen Sie über den Zugriff auf dessen Wert.
InformationsquelleAutor Shravan40
Deklarierte Variablen innen haben einen eigenen Bereich.
Sie können es verwenden, wenn Sie wissen, dass Sie nicht verwenden, die variabel außerhalb des Geltungsbereichs.
Das ist compiler-job. 🙂
InformationsquelleAutor lappet