Должен ли я использовать "long" вместо "int" на 64-битных языках с фиксированным размером шрифта (например, Java, C#)
Через 10 или даже 5 лет не будет 32-разрядных ЦП [Edit2: сервер или рабочий стол].
Итак, есть ли преимущества в использовании int
(32 бита) более long
(64 бита)?
И есть ли недостатки в использовании int
?
Редактировать:
От
10 or 5 years
Я имел в виду в подавляющем большинстве мест, где используются эти языкиЯ имел ввиду какой тип использовать по умолчанию. В эти дни я даже не буду думать, стоит ли мне использовать
short
как счетчик циклов, простоfor(int i...
, Так жеlong
счетчики уже побеждаютрегистры уже 64-битные, в 32-битных типах усиления уже нет. И я думаю, что некоторые потери в 8-битных типах (вы должны работать с большим количеством бит, чем вы используете)
3 ответа
Если вы работаете на 64-битном процессоре и скомпилировали код для 64-битной системы, то, по крайней мере, иногда, long
вероятно, будет более эффективным, потому что он соответствует размеру регистра. Но будет ли что действительно повлиять на вашу программу намного спорно. Кроме того, если вы используете long
повсеместно вы обычно будете использовать больше памяти - как в стеке, так и в куче - что может негативно повлиять на производительность. Слишком много переменных, чтобы точно знать, насколько хорошо ваша программа будет работать, используя long
по умолчанию вместо int
, Есть причины, почему это может быть быстрее, и причины, почему это может быть медленнее. Это может быть полная стирка.
Типичная вещь, которую нужно сделать, это просто использовать int
если вас не волнует размер целого числа. Если вам нужно 64-разрядное целое число, то вы используете long
, Если вы пытаетесь использовать меньше памяти и int
гораздо больше, чем нужно, то вы используете byte
или же short
,
Процессоры x86_64 будут спроектированы так, чтобы быть эффективными при обработке 32-битных программ, и это не похоже на использование int
собирается серьезно ухудшить производительность. Некоторые вещи будут быстрее из-за лучшего выравнивания при использовании 64-битных целых чисел на 64-битном процессоре, но другие будут медленнее из-за повышенных требований к памяти. И, вероятно, существует множество других факторов, которые могут определенно повлиять на производительность в любом направлении.
Если вы действительно хотите знать, что будет лучше для вашего конкретного приложения в вашей конкретной среде, вам нужно будет профилировать его. Это не тот случай, когда есть явное преимущество одного над другим.
Лично я бы посоветовал вам следовать типичному маршруту использования int
когда вы не заботитесь о размере целого и использовать другие типы, когда вы делаете.
32-разрядный - все еще полностью допустимый тип данных; так же, как у нас есть 16-битные и байты еще вокруг. Мы не выбрасывали 16-битные или 8-битные числа при переходе на 32-битные процессоры. 32-разрядное число - половина размера 64-разрядного целого числа с точки зрения хранения. Если бы я моделировал базу данных и знал, что значение не может быть выше, чем то, что может хранить 32-разрядное целое число; Я хотел бы использовать 32-разрядное целое число для целей хранения. Я бы сделал то же самое с 16-битным числом. 64-разрядное число также занимает больше места в памяти; пусть и ничего существенного, учитывая, что сегодняшние персональные ноутбуки могут поставляться с 8 ГБ памяти.
У int нет недостатка, кроме меньшего типа данных. Это все равно что спросить: "Где мне хранить сахар? В сахарнице или в бункере?" Ну, это зависит от того, сколько сахара у вас есть.
Архитектура процессора не должна сильно зависеть от того, какой тип данных вы используете. Используйте то, что подходит. Когда у нас есть 512-битные процессоры, у нас все еще будут байты.
РЕДАКТИРОВАТЬ:
Для решения некоторых комментариев / правок..
Я не уверен насчет "32-разрядных настольных процессоров не будет". ARM в настоящее время 32-битный; и заявил о небольшом интересе к 64-битным; теперь. Это не слишком хорошо сочетается с "Desktop" в вашем описании; но я также думаю, что через 5-10 лет тип устройств, которые мы пишем, также сильно изменится. Таблетки нельзя игнорировать; люди хотят, чтобы на них запускались приложения на C# и Java, учитывая, что Microsoft официально перенесла Windows 8 на ARM.
Если вы хотите начать использовать
long
; преуспевать. Нет причин не делать этого. Если мы смотрим только на процессор (игнорируя размер хранилища) и делая предположения, что мы находимся на архитектуре x86-64, то это не имеет большого значения.Предполагая, что мы придерживаемся архитектуры x86; это тоже правда. Вы можете получить немного больший стек; в зависимости от того, какие рамки вы используете.
Извините за ответ C++.
Если размер типа имеет значение, используйте размерный тип:
uint8_t
int32_t
int64_t
- так далее
Если размер не имеет значения, используйте выразительный тип:
size_t
ptrdiff_t
ssize_t
- так далее
Я знаю, что D имеет размерные типы и size_t
, Я не уверен насчет Java или C#.