Объявление «long» над «int» в Java - PullRequest
2 голосов
/ 08 октября 2009

В Java, если для поля достаточно int и если по какой-то причине я использую long, будет ли это стоить мне больше памяти? Это зависит от типа?

Ответы [ 7 ]

7 голосов
/ 08 октября 2009

В Java да, длина составляет 8 байт, а целое число - 4 байта. В этом руководстве по Java рассматриваются более простые типы данных. Если вы умножите количество выделений на определенное количество (скажем, если вы выделяете пять миллионов этих переменных), разница станет более чем незначительной. Однако для обычного использования это не так важно.

(Вы уже используете Java, так или иначе, память везде).

На родных языках есть соображения производительности; 32-разрядное значение может храниться в одном регистре в 32-разрядной архитектуре, но не в 64-разрядном значении; на 64-битных архитектурах, очевидно, может. Я не уверен, какую оптимизацию Java выполняет для своих собственных целых чисел, но это может быть верно и во время выполнения. Есть также проблемы с выравниванием, о которых стоит беспокоиться - вы увидите это больше с использованием шортов и байтов.

Лучшей практикой будет использование нужного вам типа. Если значение никогда не будет больше 2 ^ 31, не используйте long.

3 голосов
/ 08 октября 2009

Исходя из ваших предыдущих вопросов, которые вы хотите задать в области Java, тип данных int составляет четыре байта, а тип данных long - восемь байтов.

Однако, означает ли различие в размере разницу в использовании памяти, зависит от ситуации.

Если это локальная переменная, она размещается в стеке. Поскольку стек уже выделен, использование большего пространства стека не потребует больше памяти, при условии, конечно, что вы не исчерпаете стек.

Если он является членом класса, это будет зависеть от того, как члены выровнены. Иногда элементы не складываются компактно в памяти, но заполнение используется так, что некоторые элементы начинаются с четного адреса. Если, например, у вас есть байт и int в классе, между ними, вероятно, будет три байта заполнения, так что int начинается с следующего адреса, делимого на четыре.

2 голосов
/ 08 октября 2009
Длина

в Java - 64-битная, а int - 32-битная, поэтому очевидно, что long использует больше памяти (8 байт вместо 4 байт).

2 голосов
/ 08 октября 2009

int является 32-битным, а long - 64-битным. long занимает вдвое больше памяти (что довольно незначительно для большинства приложений).

1 голос
/ 08 октября 2009

... это стоило бы мне больше памяти?

Вы будете использовать дважды как память

Прежде чем беспокоиться о том, используете ли вы больше памяти или нет, вам следует профилировать.

Чтобы использовать 1 мегабайт дополнительно к оперативной памяти, используя long, а не int, вам придется объявить: 262,144 long (или использовать их косвенно в вашей программе).

Так что если по какой-то причине вы объявляете одну или две длинные переменные, когда должны использоваться int, вы будете использовать на 4 или 8 байт больше памяти. Не о чем беспокоиться (я имею в виду, что в вашем приложении могут быть проблемы с памятью)

Взято из Java Tutorial Вот определение int и long

int : тип данных int представляет собой 32-разрядное целое число с двоичным знаком со знаком. Он имеет минимальное значение -2 147 483 648 и максимальное значение 2 147 483 647 (включительно). Для целочисленных значений этот тип данных обычно является выбором по умолчанию, если только нет причины (как указано выше) выбрать что-то еще. Этот тип данных, скорее всего, будет достаточно большим для чисел, которые будет использовать ваша программа, но если вам нужен более широкий диапазон значений, используйте вместо него long.

long : тип данных long представляет собой 64-разрядное целое число со знаком двоичного числа со знаком. Он имеет минимальное значение -9,223,372,036,854,775,808 и максимальное значение 9,223,372,036,854,775,807 (включительно). Используйте этот тип данных, когда вам нужен диапазон значений, более широкий, чем значения, предоставляемые int.

Но помните: «Преждевременная оптимизация - корень всего зла» согласно Дональду Кнуту (по моему мнению, Копировать / Вставить - корень всего зла)

1 голос
/ 08 октября 2009

ifwdev угадал правильно. Java определяет int как 32-разрядное целое число со знаком, а long как 64-разрядное целое число со знаком. Если вы объявите переменную как long, то да, она займет вдвое больше памяти, чем та же переменная, объявленная как int. В общем, int обычно является числовым типом по умолчанию, даже для значений, которые могут содержаться в меньших типах, таких как short. Если у вас нет особых причин требовать значения больше 2^31-1, используйте int.

0 голосов
/ 08 октября 2009

Если вы знаете, что ваши данные будут соответствовать определенному типу данных (скажем, short int в C), единственная причина использовать больший размер - это правильная производительность? И если это ваша цель, независимо от того, насколько незначителен ваш прирост производительности, в качестве общего практического правила вы хотите использовать размер, соответствующий размеру вашей архитектуры (так что для обычной 32-разрядной целевой системы вы должны использовать 32- битовый тип).

Если вы нацелены более чем на одну систему, вы можете использовать тип данных, который соответствует наиболее часто используемому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...