Bonjour les développeurs Android / Java,
Lorsqu'une fonction appelle une fonction et cette fonction appelle un autre, etc. Existe-t-il une règle générale? P>
La raison pour laquelle je demande est parce que je suis maintenant ce qui est plus efficace (conception sage) pour mes 5 cartes de joueurs jeu p>
Solution 1: < / p> solution 2: p> i préférez la solution 2 donc s'il y a un crash, je peux voir tous les appels de la fonction de p1 à i = 0 jusqu'à p4 à i = 100 p> mais avec la solution 1, la pile est beaucoup plus courte mais quand il y a un crash, je verrai au début des boucles a la fonction appelée de la fonction () Où l'accident est arrivé P> Que suggérez-vous? Je sais que c'est un peu 2 questions dans 1 mais elles sont très liées p> merci tous p> p> p>
6 Réponses :
Je ne pense pas que vous puissiez dire qu'un numéro général d'appels de fonction X déclenchera un débordement de la mémoire de pile. Cela dépend des fonctions, de leurs arguments, de leurs types de retour, etc., tous sont conservés sur la mémoire de la pile, de sorte que différentes fonctions peuvent prendre différentes quantités de mémoire (pile). P>
En tout cas, vous ne devez jamais compter sur le code qui obtient même à distance à distance de pleurer la pile en essayant de prendre en compte la quantité de pile utilisée. Votre code doit toujours être très dégagé de déborder la pile. P>
Croyez-le ou non, je n'avais jamais pensé à empiler débordement dans ma vie de programmation car je ne me suis jamais proches de celui-ci (était toujours un appel spécifique à faire une action). Mais comme je suis en train de développer des cartes, j'ai remarqué que les joueurs ont pour se déclencher dans cette question. Vous suggérez donc que je doive toujours essayer de garder l'appel de la fonction imbriquée au minimum? 100 appel imbriqué dans une pile est trop Eh!
Eh bien, oui, bien que les 100 appels imbriqués honnêtement ne sont pas si nombreux. Peut-être que le périphérique Android étant limité a une JVM (ou tout ce qu'ils ont) qui alloue moins de mémoire de pile par rapport à un PC de bureau. En tout cas, la documentation Android spécifie la conservation des appels de méthode au minimum si la performance est un gros problème (ce qui est en quelque sorte le cas ici). Donc, oui, essayez de le faire pour que moins la méthode et la pile soient placées dans la mémoire (pile).
Il n'y a pas de règle générale pour les fonctions récursives ou imbriquées créant un débordement de pile. Au lieu de cela, elle dépend de la mémoire disponible sur la pile, qui peut varier en fonction des allocations de systèmes matériels et d'exploitation sous-jacents. P>
Il est difficile de déterminer quelle méthode d'appels de fonction est meilleure pour votre situation sans voir plus de code. Je voudrais parvenir à l'ancienne option (première) car il est un peu plus explicite envers ce qui se passe et évite de relier des méthodes possibles et des instances d'objet pouvant ne pas être nécessairement dépendantes les unes des autres. Si vous êtes principalement préoccupé par les rapports d'erreur, vous pouvez essayer d'ajouter des journaux dans votre code pour permettre plus de connaissances verbeuses de ce qui se passe, ainsi que de regarder la décharge de la trace de la pile. Espérons que ce lien peut aussi vous aider également: http://developer.android.com/tools/ Débogage / index.html p>
Merci pour la réponse la plus précise.Si je ne suis plus meilleure réponse, je vais l'accepter :)
Je pense que Shivan Dragon a raison, il n'y a pas de quantité correcte d'appels, cela provoquera un débordement. Cependant, vous pouvez le tester avec une fonction récursive vraiment simple: et l'appelez comme: p> puis voir jusqu'où il va . p> p>
Correct, mais je veux être si proche que chaque appareil est différent. Mais vaut la peine d'essayer
Dans mon expérience, un débordement de pile en Java est presque toujours dû à une erreur de programmation. Voir Types typiques ici . P>
Maintenant, votre deuxième solution est, imo, assez laide ... presque une erreur de programmation. En supposant que N = 100 est (sorte de) la durée de votre jeu, il semble tort que la consommation de mémoire (taille de la pile) augmente avec elle. Je n'aime pas du tout cette solution. P>
Quand il y a un crash, je verrai au début des boucles un appelé fonction de fonction () où l'accident est arrivé p> blockQuote>
Je ne vois pas l'avantage réel. Pourquoi ne pas mettre un
essayer de prendre un bloc code> de sorte que, dans le cas d'un crash, vous pouvez imprimer le numéro d'itération? P>
Ok c'est une sorte de réponse que je cherchais. Je pense que je voudrais aller avec le premier
Ceci est descendu au principe de la récursion vs itération. P>
Récursion vous permet d'écrire un algorithme de manière simple; plus facile à comprendre et plus rapide à mettre en œuvre. Des algorithmes récursifs peuvent être convertis en algorithmes itératifs qui seront plus efficaces de mémoire et plus efficaces du processeur. P>
La décision est donc l'une des performances VS Simplicity / Coding Effort. P>
Voici un fil de ce sujet: Récursion ou itération? P>
Pourquoi vous n'appelez pas la fonction la plus imbriquée à la première fois.