2009-07-22 10 views
8

Mam program C, aby sprawdzić, czy stos maszyna rośnie w górę lub w dół w pamięci wW jaki sposób dowiesz się, czy stos maszyny rośnie w górę lub w dół w pamięci? (JAVA)

To idzie tak:.

#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); 
} 

Teraz chcę zrobić to samo w Javie . :-)

Ktoś zna rozwiązanie bez pisania natywnego kodu ???

Dzięki

+0

Btw, dlaczego chcesz zrobić to samo w Javie? Czysta ciekawość? –

+0

Nic, zostałem zadany to pytanie w google. Następnie ankieter poprosił mnie o zaimplementowanie tego w Javie. :-) – Roman

+0

Ten kod jest uszkodzony. Więcej szczegółów w mojej odpowiedzi poniżej. – sigjuice

Odpowiedz

14

Jeśli nie robią żadnego kodu macierzystego, to nie mogę sobie wyobrazić sytuację, w której mogłaby ona materii w czystego kodu Java. W końcu stos Java może zostać przydzielony w dowolnym kierunku, zamiast być ściśle przylegającym blokiem pamięci (jak stos maszynowy).

+7

Po prostu, aby zrozumieć, co on oznacza - nie ma zasady, która mówi, że musi iść w górę * lub * w dół. Jeśli chcesz, możesz przechowywać każdą klatkę połączenia w pozycji przydzielonej sterty i jeździć wszędzie. W przypadku współpracy GC/JIT można nawet przesuwać ramki stosów podczas pracy programu. * Możliwość obsługi tej elastyczności polegała na usunięciu umiejętności programisty do bezpośredniego jej zbadania. * –

+2

"możesz przechowywać każdą klatkę połączenia w pozycji przydzielonej sterty". Pracowałem z implementacją, która to zrobiła.W rzeczywistości nie tworzył przydziału dla każdej klatki, używał kawałka, a potem był przykuty do drugiego. Tak więc w prostym teście (jeśli byłby możliwy), wydawałoby się, że zejdzie, ale faktycznie zszedł nieco na dół, a następnie "w bok" do nowego bloku, a następnie ponownie w dół. Powodem było to, że JVM została zaprojektowana do pracy na architekturach pozbawionych pamięci wirtualnej. Tak więc jedynym sposobem na zarezerwowanie dużego, ciągłego zakresu dla stosu byłoby przydzielenie go z góry dla każdego wątku. –

+0

... Nie wiem, czy ta strategia jest wspólna, ponieważ jest to tylko jedna z implementacji, w której kiedykolwiek zdarzyło mi się odejść. Ale na pewno nie zawiodły żadne testy zgodności, więc nie można tego wykluczyć. –

2

woah, nie będziesz w stanie uzyskać żadnych użytecznych informacji z prostego kodu w Javie, przynajmniej o tym nie wiem.

Kod, który posiadasz, zawiera wiele założeń, które nawet w C mogą być prawdą lub nie. Będzie to zależało od platformy i systemu operacyjnego, na którym działa twój program.

W Javie będziesz całkowicie zależny od wdrożenia JVM w celu adresowania i jako taki nie będzie mógł tego zrobić.

Moja pierwsza odpowiedź to użycie profilera. W tym celu można również utworzyć własnego agenta profilowania, korzystając z usługi API provided (JVMTI). Jest to o wiele bardziej złożone niż twoje podejście, ale powinieneś być w stanie uzyskać to, czego potrzebujesz.

Istnieje również ta page w firmie IBM, która może być pomocna.

To jest dość dużo wszystko, co mam na ten temat, mam nadzieję, że to pomoże Ci

6

kod źródłowy Java kompiluje do kodu bajtowego Javy, która jest zgromadzenie jak język, który działa na JVM. JVM to maszyna wirtualna, więc będzie wyglądać dokładnie tak samo z definicji zarówno na maszynach stosujących układanie w stosy i układanie w stosy.

Z tego powodu nie można stwierdzić, czy na określonym stosie maszyn rośnie lub maleje z kodu Java.

6

Nie można tego zrobić w kodzie Java. Nie można tego zrobić również w kodzie C. Kod, który wysłałeś, wywołuje niezdefiniowane zachowanie: (&b > a). Zgodnie ze standardem wynik porównania dwóch wskaźników jest niezdefiniowany, chyba że wskaźniki wskazują na elementy w obrębie tej samej tablicy. Standard nie mówi nic o kierunku wzrostu stosu ani o tym, czy stos istnieje.

+0

Więc nie ma sposobu, aby powiedzieć, czy stos rośnie w górę lub w dół w C? –

Powiązane problemy