Comment voulez-vous savoir si une machine est pile grandit vers le haut ou vers le bas dans la mémoire? (JAVA)
J'ai un programme en C pour vérifier si la machine de la pile grandit vers le haut ou vers le bas dans la mémoire.
Il va comme ça :
#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);
}
Maintenant, je veux faire la même chose en Java. 🙂
Un connait une solution sans avoir à écrire de code natif ???
Grâce
Btw, pourquoi voulez-vous faire la même chose en Java? Par Pure curiosité?
De rien , j'étais posé cette question dans google. Ensuite, l'interviewer a demandé de me mettre en java. 🙂
Ce code est cassé. Plus de détails dans ma réponse ci-dessous.
De rien , j'étais posé cette question dans google. Ensuite, l'interviewer a demandé de me mettre en java. 🙂
Ce code est cassé. Plus de détails dans ma réponse ci-dessous.
OriginalL'auteur Roman | 2009-07-22
Vous devez vous connecter pour publier un commentaire.
Si vous ne faites pas tout en code natif, alors je ne peux pas imaginer une situation où il pourrait la matière en pur Java. Après tout, la Java de la pile peut être alloué dans n'importe quelle direction à tous au lieu d'être strictement un bloc contigu de mémoire (comme la machine à pile).
"vous pouvez stocker chaque appel de cadre à un segment de mémoire allouée position". J'ai travaillé avec une mise en œuvre qui l'a fait. En fait ce n'était pas une allocation pour chaque trame, il a utilisé un morceau et ensuite enchaîné sur une autre. Ainsi, dans un test simple (si possible), il serait apparu pour aller vers le bas, mais en fait, est allé vers le bas pour un peu, puis "de côté" pour un nouveau bloc, puis vers le bas à nouveau. La raison en était que la JVM a été conçu pour fonctionner sur des architectures manque de mémoire virtuelle. Donc le seul moyen de réserver une grande plage contiguë de la pile aurait été de les attribuer tous à l'avance pour chaque thread.
... Je ne sais pas si oui ou non cette stratégie est commune, car il n'est qu'une mise en œuvre que j'ai jamais eu le couvercle. Mais nous n'avons certainement pas en panne tout les tests de conformité, de sorte que vous ne peut pas l'exclure.
RISC OS (APC-R) l'a fait. Il a été principalement utilisé pour la C.
OriginalL'auteur Greg Hewgill
Le code source Java est compilé en Java byte-code qui est une assemblée comme la langue qui tourne sur la JVM. La JVM est une machine virtuelle et donc il aura exactement la même apparence par définition à la fois sur des machines de la pile et la pile vers le bas.
De ce fait, il n'est pas possible de savoir si sur une machine spécifique de la pile grandit vers le haut ou vers le bas à partir du code Java.
OriginalL'auteur Gregory Mostizky
Cela ne peut être fait dans du code Java. Il ne peut pas être fait dans le code C, soit. Le code que vous avez posté invoque un comportement indéfini
(&b > a)
. Selon la norme, le résultat de la comparaison de deux pointeurs est pas défini, à moins que les pointeurs de point d'éléments dans la même matrice. La norme ne dit rien sur le sens de la croissance de la pile ou si une pile de même qu'il existe.OriginalL'auteur sigjuice
woah, vous ne serez pas en mesure d'obtenir toute l'information utile d'un tel code simple en Java, du moins pas que je sache.
Le code que vous avez fait beaucoup d'hypothèses qui, même en C, en fait, peut ou peut ne pas être vrai. Il dépendra de la plate-forme et système d'exploitation qui est en cours d'exécution de votre programme.
En Java, vous serez complètement dépendante de la JVM de la mise en œuvre de l'adressage et en tant que tel ne sera pas en mesure de le faire.
Ma première réponse serait d'utiliser un profiler. Vous pouvez également créer votre propre agent de profilage à l'aide de la API fournie (JVMTI) à cette fin. Il est beaucoup plus complexe, certainement que votre approche, mais vous doit être en mesure d'obtenir ce dont vous avez besoin.
Il y a aussi ce page à IBM, qui peut être de l'aide.
C'est à peu près tout ce que j'ai sur le sujet, j'espère que ça va vous aider à
OriginalL'auteur Newtopian