0

Ich weiß, was Stapel und wie sie arbeiten. Ich weiß auch, dass jede Funktion einen eigenen Stapel im Speicher zugeordnet ist, und das ist, was den Anwendungsbereich macht. aber die Sache, die mich verwirrt, ist, wie der Compiler herausfindet, dass diese Namen in diesem Bereich deklariert sind. tut es den ganzen Stapel und überprüft, entfaltet sich, wenn es einen Eintrag für den Namen gegeben ist (es scheint anstrengend) diesen Code betrachten.Wie der Compiler den Bereich auflöst?

void func(int a) 
{ 
    cout<<a; 
    cout<<b; 
} 

hier Stapel von func für ein enthalten Eintrag wird aber, wenn Compiler begegnet dem Namen b es überprüft den Stack und findet heraus, dass es keinen Eintrag für b gibt. Jetzt stellt sich die Frage, wie es prüft, entfaltet es den ganzen Stapel. und Was ist, wenn diese Funktion innerhalb einer anderen Funktion deklariert ist, die b enthält, muss sie auch alle anderen Stapel entfalten?

+0

Die Funktion hat keinen eigenen Stack. Die Funktion weist dem Prozessstapel einen Stapelrahmen zu. Dies geschieht zur Laufzeit, nicht zur Kompilierzeit. Wie in der Antwort unten erwähnt, verwendet der Compiler eine Hierarchie von Symboltabellen (oder deren logische Entsprechung), um Umfangsprobleme zu lösen. –

Antwort

4

Compiler lösen den Gültigkeitsbereich von Variablen über Symboltabellen auf. Jeder Bereich erhält eine eigene Symboltabelle, und diese Tabellen sind auf der Grundlage der Struktur des Programms hierarchisch organisiert.

Wenn der Compiler den Gültigkeitsbereich einer Variablen auflösen möchte, prüft er zunächst, ob er in der Symboltabelle des aktuellen Bereichs vorhanden ist. Wenn es nicht gefunden wird, versucht es die Symboltabelle des übergeordneten Bereichs und so weiter.

Jede Symboltabelle sollte relativ schnell durchsucht werden.

Siehe here für ein visuelles Beispiel.