2009-02-08 22 views
5

Angenommen, wir haben diese lokalen Variablen:Wie wird auf Variablen im Stack zugegriffen?

int a = 0; 
int b = 1; 
int c = 2; 
int d = 3; 

Soweit ich weiß, werden diese auf dem System-Stack zugeordnet werden, wie folgt aus:

| | 
| 3 | d 
| 2 | c 
| 1 | b 
|_0_| a 

dies, dass das bekommen, um Heisst Wert von a, die Werte von d, c und b müssen zuerst aus dem Stapel herausgeholt werden? Wenn ja, wohin gehen diese Werte? Bedeutet dies, dass der Zugriff auf kürzlich deklarierte Variablen schneller ist? Oder fehlt mir etwas (was ich vermute), und die ganze Sache funktioniert auf andere Weise?

EDIT: danke, Leute!

Antwort

16

Die lokalen Variablen im Stack werden normalerweise relativ zum so genannten Frame-Zeiger angesprochen, der auf den Anfang Ihres Stack-Frames zeigt. Es wäre auch möglich, dies relativ zum Stapelzeiger durchzuführen, aber da dies sich während der Auswertung von Ausdrücken bewegt, ist es schwieriger, den Überblick zu behalten.

In der Praxis können solche Variablen auch in Prozessorregistern gehalten werden.

+0

+1 für die Erklärung des Stack-Pointer vs. Frame-Pointer – Christoph

+0

+1 wieder für Erklärung – cbrulak

+0

+1 nicht zu brechen die +1 Sequenz –

5

Oder bin ich etwas fehlt

Sie verpassen, dass der Stapel in regelmäßigen Speicher befindet, die Direktzugriff erlaubt - einfach die entsprechende an den Rahmenzeiger (der Unterseite des ‚lokalen Offsetzumischung 'stack) und Sie erhalten einen Zeiger auf die Speicherzelle, die den Wert enthält.

1

Bedeutet dies, dass zunächst aus dem Stapel genommen werden, um den Wert von a, die Werte von d, c und b zu bekommen?

Der ausgegebene Code verschiebt einfach die stack pointer die richtige Anzahl von Bytes beim Eingeben der Funktion. Es bewegt sich beim Verlassen der Funktion um denselben Abstand zurück. Daher werden die Variablen nicht einzeln angezeigt. Angenommen, ein int ist 4 Bytes, das Beispiel, das Sie gaben, würde den Stapelzeiger 16 Byte verschieben. Es verschiebt es tatsächlich weiter als dies wegen anderer Information in dem Stapelrahmen wie der Rücksendeadresse.

+0

danke! (und der Link war auch sehr nützlich) – neo2862