3 votes

Vérification du concept : Le modèle d'allocation de mémoire de Java, basé sur le tas uniquement, ne signifie pas qu'il n'y a pas de pile d'appels de fonctions, n'est-ce pas ?

Je suis un peu confus sur le degré d'"absolus" ici.

Je sais que l'allocation de mémoire en C++ peut se faire par le tas ou la pile. Et je sais que l'allocation de mémoire en Java ne peut se faire que par le tas.

En gros, est-ce que ce qui suit est correct ?

"Java n'a pas d'allocation de mémoire basée sur la pile [à laquelle les programmeurs peuvent accéder directement]" ne doit pas être confondu avec "Java utilise toujours une pile d'appel de fonction pour implémenter les appels de fonction, comme tous les autres langages".

http://en.wikipedia.org/wiki/Stack-based_memory_allocation http://en.wikipedia.org/wiki/Dynamic_memory_allocation

7voto

jjnguy Points 62123

Java enregistre les primitives locales sur la pile d'appels. Ainsi, tout ne se trouve pas sur le tas.

La principale différence entre le modèle de mémoire de Java et de C++ est qu'en Java, vous ne pouvez pas choisir où enregistrer vos objets, Java décide pour vous.

4voto

Matthew Flaschen Points 131723

Je dirais que les programmeurs peuvent y accéder directement. Vous ne pouvez pas placer de tableaux sur la pile, mais vous pouvez déclarer des variables locales, qu'il s'agisse de primitives ou de références. Par exemple :

static void foo(double baz)
{
  int foo = ...;
  JFrame baz = ...;
}

foo, bar et baz sont tous placés sur la pile (alors que l'objet JFrame est placé sur le tas).

Vous avez raison de dire qu'il utilise un cadre de pile de manière assez similaire à la plupart des langages. En fait, la JVM elle-même est orientée pile, ce qui signifie que les opérations se font sur le sommet de la pile (plutôt sur le contenu des registres). Par exemple, ladd extrait les deux premiers éléments de la pile, les additionne, puis pousse le résultat. Et il ne faut pas oublier notre vieil ami StackOverflowError .

0voto

Eli Courtwright Points 53071

Java possède effectivement une pile d'appels de fonctions, même si toutes les allocations de mémoire se font sur le tas. Voici un exemple

static LinkedList<Object> foo(int x)        // x is pushed onto the stack
{
    int y = x;                // this is a basic data type, so it goes on the stack
    Object o = new Object();  // the Object is in the heap, but the pointer to it is on the stack
    List<Object> xs = new LinkedList<Object>();  // ditto
    xs.append(o);             // a copy of the pointer to my object is now in the LinkedList on the heap
    return xs;                // the pointer to the structure is returned through the stack
}

0voto

frm Points 1398

Java dispose à la fois d'une pile et d'un espace heap.

La règle générale est la suivante : chaque objet que vous créez avec new va dans l'espace du tas, tout le reste est sur la pile d'appel.

Les références aux objets (et aux tableaux, qui sont des types particuliers d'objets) peuvent créer une certaine confusion. Lorsque vous avez Object o = new Object() l'objet est alloué avec new Il est donc sauvegardé dans l'espace du tas, mais la référence à cet objet (une sorte de pointeur) que vous avez dans le fichier o est dans la pile d'appels.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X