Распределение памяти в Java - декларация против определения

1

В C, когда мы объявляем что-то, мы сообщаем компилятору, в какой форме содержится эта переменная. Только во время определения мы выделяем для него пространство памяти. Однако в Java пространство памяти выделяется, когда мы объявляем переменную

int x; // allocates space for an int

Правильно ли мое помещение? Означает ли это, что мы должны быть редкими с декаляризацией, насколько это возможно?

  • 1
    (1) не беспокойтесь об этом, вы напишите ужасный код, если вы это сделаете. (2) Вы говорите только о примитивах или примитивах и объектах. (3) единственный раз, когда это будет иметь значение, это огромные массивы, и они являются объектами
  • 0
    Мне любопытно об обоих. Но был ли я прав, говоря, что память выделяется во время объявления в Java, а не во время определения, как в C?
Показать ещё 2 комментария
Теги:

2 ответа

3
Лучший ответ

Когда дело доходит до переменных в Java, разделение между декларациями и определениями отсутствует. Однако это не влияет на процесс выделения памяти.

Что происходит с распределением памяти в Java, близко к тому, что происходит с распределением памяти из динамической области (т.е. "кучей") в C. Там, определяя переменную типа указателя, выделяет пространство для самой переменной, но она не выделяет память для чего указывает указатель. Вот пример простой обработки строк в C:

// Allocate memory for the pointer
char *str;
// Allocate memory for the string itself
str = malloc(16);
// Copy the data into the string
strcpy(str, "Hello, world!");

Подобные вещи происходят в Java, когда вы имеете дело с объектами. Определение переменной выделяет пространство для ссылки на объект, но не для объекта. Вам нужно вызвать new, чтобы "прикрепить" эту ссылку к новому объекту:

// Allocate memory for the reference
String str;
// Allocate memory for the string, and sets data
str = new String("Hello, world!");

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

2

Объем памяти для примитива будет выделен, когда выделена память для экземпляра объекта. Для статического примитива он выделяется при загрузке класса.

Нет, вы не должны пытаться микро-оптимизировать такие вещи. Это не C, это Java.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню