2009-07-22 6 views
8

Ich habe ein C-Programm zu prüfen, ob die Maschine Stack wächst nach oben oder unten im Speicher inWie finden Sie heraus, ob der Stack eines Rechners im Speicher auf- oder abfällt? (JAVA)

Es geht wie folgt aus:.

#include <stdio .h> 

void sub(int *a) { 
int b; 

if (&b > a) { 
    printf("Stack grows up."); 
} else { 
    printf("Stack grows down."); 
} 
} 

main() { 
int a; 
sub(&a); 
} 

Jetzt möchte ich in Java, das gleiche tun . :-)

Jeder weiß eine Lösung, ohne irgendeinen nativen Code zu schreiben ???

Dank

+0

Btw, warum willst du dasselbe in Java machen? Reine Neugier? –

+0

Nichts, ich wurde diese Frage in Google gestellt. Dann bat mich der Interviewer, dies in Java zu implementieren. :-) – Roman

+0

Dieser Code ist kaputt. Mehr Details in meiner Antwort unten. – sigjuice

Antwort

14

Wenn Sie alle nativen Codes nicht tun, dann kann ich nicht eine Situation vorstellen, wo es möglicherweise in reinem Java-Code Rolle könnte. Schließlich könnte der Java-Stapel überhaupt in irgendeiner Richtung zugewiesen sein, anstatt ein streng zusammenhängender Speicherblock (wie der Maschinenstapel) zu sein.

+7

Nur damit du erkennst, was er meint - es gibt keine Regel, die besagt, dass sie * oder * runter gehen muss. Wenn Sie möchten, können Sie jeden Aufrufrahmen an einer Position speichern, an der der Heapspeicher zugewiesen ist, und den gesamten Bereich durchlaufen. Mit einer GC/JIT-Kooperation können Sie die Stack-Frames sogar verschieben, während das Programm läuft. * Die Fähigkeit, diese Flexibilität zu unterstützen, kam, indem die Fähigkeit des Programmierers, es direkt zu untersuchen, entfernt wurde. * –

+2

"Sie könnten jeden Aufrufrahmen an einer vom Heap zugewiesenen Position speichern". Ich habe mit einer Implementierung gearbeitet, die das getan hat.Tatsächlich hat es nicht für jeden Frame eine Zuweisung gemacht, es hat einen Chunk verbraucht und dann an einen anderen gekettet. In einem einfachen Test (wenn es möglich wäre) wäre es zwar untergegangen, wäre aber etwas nach unten gegangen, dann "seitwärts" zu einem neuen Block und dann wieder runter. Grund war, dass die JVM entworfen wurde, um auf Architekturen zu arbeiten, denen virtueller Speicher fehlte. Die einzige Möglichkeit, einen großen zusammenhängenden Bereich für den Stapel zu reservieren, wäre gewesen, alles für jeden Thread vorab zuzuweisen. –

+0

... Ich weiß nicht, ob diese Strategie üblich ist oder nicht, da es nur diese eine Implementierung ist, die ich je hatte. Aber wir haben sicherlich keine Konformitätstests bestanden, also können Sie es nicht ausschließen. –

2

woah, Sie werden jede nützliche Informationen, um aus so einfachen Code in Java nicht in der Lage sein, nicht zuletzt, die ich kenne.

Der Code, den Sie haben, macht viele Annahmen, die, sogar in C, tatsächlich wahr sein können oder auch nicht. Dies hängt von der Plattform und dem Betriebssystem ab, auf dem das Programm ausgeführt wird.

In Java werden Sie voll und ganz auf die Implementierung der JVM abhängig sein für die Adressierung und als solche werden diese nicht in der Lage zu tun.

Meine erste Antwort wäre, einen Profiler zu verwenden. Sie können zu diesem Zweck auch einen eigenen Profilerstellungs-Agent unter Verwendung der API provided (JVMTI) erstellen. Es ist viel komplexer als Ihr Ansatz, aber Sie sollten in der Lage sein zu bekommen, was Sie brauchen.

Es gibt auch diese page bei IBM, die hilfreich sein kann.

Das so ziemlich alles, was ich zu diesem Thema haben, ich hoffe, es wird Ihnen Quellcode kompiliert Java-Byte-Code

6

Java helfen, die eine Anordnung wie die Sprache ist, die auf der JVM läuft. JVM ist eine virtuelle Maschine und so wird es genauso aussehen per Definition sowohl auf Maschinen, die Stack-Up und Stack-Down verwenden.

Aus diesem Grund ist es nicht möglich zu wissen, ob auf einem bestimmten Maschinenstapel Java-Code auf- oder abwächst.

6

Dies kann nicht in Java-Code durchgeführt werden. Es kann auch nicht in C-Code getan werden. Der von Ihnen gepostete Code ruft undefiniertes Verhalten auf (&b > a). Gemäß dem Standard ist das Ergebnis des Vergleichs zweier Zeiger nicht definiert, es sei denn, die Zeiger zeigen auf Elemente innerhalb desselben Arrays. Der Standard sagt nichts über die Richtung des Stapelwachstums aus oder ob ein Stapel überhaupt existiert.

+0

Also gibt es keine Möglichkeit zu sagen, ob der Stapel in C nach oben oder unten wächst? –

Verwandte Themen