Проверка концепции: модель выделения памяти только для кучи Java не означает, что в ней нет стека вызовов функций, верно? - PullRequest
3 голосов
/ 21 июня 2010

Я немного запутался в степени "абсолютности" здесь.

Я знаю, что выделение памяти в C ++ может быть выполнено либо кучей, либо стеком.И я знаю, что выделение памяти Java может быть сделано только через кучу.

В принципе, правильно ли следующее?

«У Java нет выделения памяти на основе стека [к которому программисты могут иметь прямой доступ]» не следует отождествлять с «Java все еще использует стек вызовов функций для реализации вызовов функций, как и любой другой язык».

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

Ответы [ 3 ]

7 голосов
/ 21 июня 2010

Java сохраняет локальные примитивы в стеке вызовов. Так что не все в куче.

Основное различие между моделью памяти Java и C ++ состоит в том, что в Java вы не можете выбирать, где сохранять свои объекты, Java решает за вас.

4 голосов
/ 21 июня 2010

Я бы сказал, что программисты могут получить к нему прямой доступ.Вы не можете поместить массивы в стек, но вы можете объявить локальные переменные, будь то примитивы или ссылки.Например:

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

foo, bar и baz все помещаются в стек (в то время как объект JFrame помещается в кучу).

Вы правы, что он использует стеккадр очень похож на большинство языков.Фактически, сама JVM ориентирована на стек, а это означает, что операции работают на вершине стека (а точнее на содержимом регистров).Например, ladd извлекает два верхних элемента стека, добавляет их, а затем отправляет результат.И мы не должны забывать нашего старого друга StackOverflowError.

0 голосов
/ 21 июня 2010

У Java действительно есть стек вызовов функций, хотя все выделения памяти происходят в куче. Вот пример

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...