In C, wie viele von Ihnen wissen, befinden sich alle lokalen Variablen im Stapel. Da der Stack eine First-in-Last-Out-Datenstruktur darstellt, können Sie nur auf das zugreifen, was zuletzt auf ihn übertragen wurde. So den folgenden Code angegeben:Was ist die Idee hinter einem Stack für lokale Variablen?
int k = 5;
int j = 3;
short int i;
if (k > j) i = 1;
Offensichtlich ist dies nutzlos Code, der keine wirkliche Bedeutung hat, aber ich versuche, meinen Kopf um etwas zu wickeln.
Für die kurze int i Deklaration nehme ich an, dass 2 Bytes auf dem Stack zugewiesen werden. Für int k und int j für beide 4 Bytes erhalten mit den Werten zugeordnet 5 und 3. So würde der Stapel aus, als
---------- <- stack pointer
int i
----------
int k = 5
----------
int j = 3
----------
so folgt für die if-Anweisung Sie würde den int Pop habe ich das bekommen Bedingungen k und j, und wenn ja, wohin int gehe ich? Dies alles scheint sehr zeitaufwendig und langwierig zu sein, wenn C so lokale Variablen verwendet.
Also ist das tatsächlich, wie C es tut, oder bin ich mucking alles auf?
tatsächlich ist Ihr Layout der Elemente auf dem Stapel falsch, da ich ein kurzer, nicht ein int bin. und ein Stapel wächst im Speicher nach unten, nicht nach oben, und lokale Variablen werden in umgekehrter Reihenfolge auf den Stapel gelegt. Unabhängig davon wird jeder Wert auf dem lokalen Stapel NICHT gepoppt, sondern ein Offset vom Stapelzeiger wird verwendet, so dass Bezug auf 'k' in "Wort lesen (irgendein Register) von sp [(Offset zu k)" ähnlich für das 'j 'Variable. und 'i' wird gesetzt als "schreibe Halbwort sp [Offset zu i] von (untere Hälfte des Registers, das das Ergebnis von k + j enthält) Im Allgemeinen kann man sich den Stapel als ein langes Array mit Partitionen vorstellen – user3629249