Angenommen, dies:
void func()
{
...
if( blah )
{
int x;
}
...
}
Ist der Platz für x
den Stapel sofort reserviert, wenn er func
eingegeben wird, oder nur, wenn der Block tatsächlich ausgeführt wird?
Oder ist es die Wahl des Compilers?
Verhalten sich C und C ++ dabei gleich?
c++
c
stack
allocation
Petruza
quelle
quelle
Antworten:
Wer hat gesagt, dass der Compiler keinen Platz reserviert (könnte nur registriert werden).
Dies ist völlig undefiniert.
Sie können nur sagen, dass auf it (
x
) nur innerhalb des inneren Blocks zugegriffen werden kann.Wie der Compiler Speicher zuweist (auf einem Stapel, falls vorhanden), liegt vollständig beim Compiler (da der Speicherbereich möglicherweise für mehrere Objekte wiederverwendet wird (wenn der Compiler nachweisen kann, dass sich ihre Lebensdauer nicht überschneidet)).
Unbestimmt.
Unbestimmt.
Wenn es sich
x
jedoch um ein Klassenobjekt handelt, wird der Konstruktor nur ausgeführt, wenn der Block eingegeben wird.Der Compiler weist möglicherweise nicht einmal Speicher zu.
Ja
quelle
Nun, es ist wirklich die Wahl des Compilers, aber was ich beobachtet habe, ist, dass der Compiler beim Kompilieren ohne Optimierungen (was wir normalerweise tun, um unseren Code debuggen zu können) dazu neigt, die Dinge ziemlich klar zu machen geschnittene, deterministische und zuverlässige Mode:
Der Compiler ist nicht optimieren entfernt alle lokalen Variablen. (Außer vielleicht Variablen, die explizit als definiert sind
register
, aber das muss überprüft werden.)Der Stapelspeicherplatz für alle lokalen Variablen, unabhängig davon, wie sie verschachtelt sind, wird bei der Eingabe der Funktion sofort reserviert.
Der Stapelspeicher wird nicht über separate verschachtelte Bereiche hinweg wiederverwendet. Dies bedeutet, dass
void f(){ { int x; } { int y; } }
Platz für zweiint
Variablen zugewiesen wird. Der zugewiesene Speicherplatzx
wird nicht wiederverwendety
.Wenn Sie Optimierungen aktivieren, ist natürlich alles wahr, was Loki Astari in der akzeptierten Antwort geschrieben hat.
quelle