Warum wird ein Funktionsaufruf anstelle von Variablenadressen zur Erkennung der Stapelwachstumsrichtung verwendet?

8

Ich lese verschiedene Antworten auf die Frage nach der Erkennung von Stack Growth und ich verstehe, dass Stacks in modernen Architekturen zufällig wachsen, außerhalb des Heapspeichers erstellt werden und so weiter.

In dieser klassischen Interviewfrage möchte ich jedoch verstehen, warum Personen einen Funktionsaufruf verwenden, anstatt zwei lokale Variablen in derselben Funktion zu vergleichen. Ich denke, es muss einen bestimmten Grund dafür geben, aber ich bin kein C / Low-Level-Entwickler [Java :)], ich rate einfach.

Hier ist der Code, den ich ausprobiert habe:

%Vor%

Ich habe auch diesen Artikel gefunden, der versucht, die Lösung zu optimieren, die ich auch nicht verstehe: Ссылка

P.S: Aus verschiedenen Antworten auf diese und andere Threads scheint die Frage selbst fehlerhaft / irrelevant zu sein, als Interviewfrage setzt sie wahrscheinlich falsche Annahmen um, es sei denn, jemand erforscht die Antwort!

Danke!

    
codeObserver 21.05.2011, 01:41
quelle

5 Antworten

4

Innerhalb von einem einzelnen Stapelrahmen kann der Compiler die lokalen Variablen nach Belieben sortieren, also den Code:

%Vor%

kann i vor oder nach j haben. Solange die Kompilierung den richtigen Code für den Zugriff auf die Variable generiert, kann sie überall hingelangen.

Tatsächlich, wenn Sie nicht den address-of-Operator & verwenden (oder anderweitig auf die Adresse zugreifen müssen), darf die Variable niemals auf dem Stack sein. Es kann für die Dauer des Anrufs in einem Register gespeichert werden.

Allerdings ist die Reihenfolge, in der die Stack-Frames gesetzt werden, eingeschränkt, da Funktionsrückgaben, wenn sie nicht in Ordnung sind, nicht so gut funktionieren (um es milde auszudrücken).

Ich sollte natürlich erwähnen, dass die Richtung des Stackwachstums nur in einer sehr begrenzten Anzahl von Szenarien nützlich ist. Die überwiegende Mehrheit des Codes sollte sich nie darum kümmern. Wenn Sie sich für unterschiedliche Architekturen und deren Handhabung interessieren, lesen Sie diese Antwort .

    
paxdiablo 21.05.2011, 01:46
quelle
6

Sie können die Reihenfolge, in der der Compiler die lokalen Variablen zuweist, nicht vollständig steuern. Sie können jedoch die Funktionen, die aufgerufen werden sollen, und in welcher Reihenfolge steuern.

    
Ignacio Vazquez-Abrams 21.05.2011 01:43
quelle
5

Die Reihenfolge, in der deklarierte Variablen auf dem Stack platziert werden, ist undefiniert, aber in einer Funktion, die von einer Funktion aufgerufen wird, werden die Argumente des inneren Funktionsaufrufs notwendigerweise später auf den Stapel geschoben als die der äußeren Funktion.

    
Grumdrig 21.05.2011 01:44
quelle
4

Compiler können und ordnen Variablen in Stack-Frames neu:

%Vor%

drucken

%Vor%

hier (mit gcc 4.4.3 auf einem 64-Bit-Linux). c2 wurde neben c1 verschoben.

    
AProgrammer 21.05.2011 02:06
quelle
3

Das Problem ist, dass wenn Sie dies tun:

%Vor%

Das Ergebnis, das Sie erhalten, hat nichts mit der Wachstumsrichtung des Stapels zu tun. Die einzige Möglichkeit zu wissen, auf welche Weise der Stack wächst, ist das Erstellen neuer Frames . Der Compiler kann a über b oder a unter b setzen, wenn er es für richtig hält. Verschiedene Compiler können unterschiedliche Ergebnisse liefern.

Wenn Sie jedoch eine andere Funktion aufrufen, müssen sich die lokalen Variablen dieser Funktion in einem neuen Stapelrahmen befinden, d. h. in Richtung des Wachstums aus den Variablen des Aufrufers.

    
Dietrich Epp 21.05.2011 01:45
quelle

Tags und Links