2009-10-08 7 views
2

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

+8

На каком языке и на какой платформе? Это довольно расплывчато, и ответы будут компилятором и зависят от платформы (если вы спрашиваете, о чем я думаю, что вы). –

+0

Извините, что забыл добавить этот язык. Ява. – DragonBorn

+0

Это действительно неопределенный вопрос. Не зная, на какой платформе и языке трудно ответить. Большую часть времени небольшая разница в памяти компенсируется более быстрыми операциями ЦП. –

ответ

2

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

+3

В компиляторах MS C/C++ long и int имеют одинаковый размер. – Michael

+2

Это компилятор языка и зависит от платформы. Это всегда будет 32 и 64 для java и C#. –

+3

Этот ответ верен для Java. – mob

2

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

7

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

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

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

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

+1

Я уверен, что скорость в равной степени применима к java, как к родным языкам. – rmeador

+0

Я тоже. Просто не уверен. –

3

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

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

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

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

1

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

0

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

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

1

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

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

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

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

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

Взятая из Java Tutorial здесь это определение междунара и долго

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

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

Но помните: "Premature optimization is the root of all evil" в соответствии с Дональдом Кнутом (по мне Copy/Paste является корнем всех зол, хотя)

Смежные вопросы