Должен ли я использовать «long» вместо «int» на 64-битных языках с фиксированным размером шрифта (например, Java, C #) - PullRequest
11 голосов
/ 26 июля 2011

Через 10 или даже 5 лет не будет [ Edit2: сервер или рабочий стол] 32-разрядных процессоров.

Итак, есть ли преимущества в использовании int (32 бита) по сравнению с long (64 бита)?
И есть ли недостатки в использовании int?


Изменить:

  1. Под 10 or 5 years Я имел в виду в подавляющем большинстве мест, где используются эти языки

  2. Я имел в виду, какой тип использовать по умолчанию . В эти дни я даже не буду думать, стоит ли мне использовать short в качестве счетчика циклов, просто for(int i.... Точно так же long счетчики уже выигрывают

  3. регистры уже 64-битные, усиления в 32-битных типах уже нет. И я думаю, что некоторые потери в 8-битных типах (вам нужно работать с большим количеством битов, чем вы используете)

Ответы [ 3 ]

12 голосов
/ 26 июля 2011

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

Нет недостатка в int, кроме меньшего типа данных.Это все равно что спросить: «Где мне хранить сахар? В сахарнице или в бункере?»Ну, это полностью зависит от того, сколько у вас сахара.

Архитектура процессора не должна сильно зависеть от того, какой тип данных вы используете.Используйте то, что подходит.Когда у нас есть 512-битные процессоры, у нас все еще будут байты.

РЕДАКТИРОВАТЬ :

Для рассмотрения некоторых комментариев / правок ..

  1. Я не уверен насчет "32-разрядных настольных процессоров не будет".ARM в настоящее время 32-битный;и объявил небольшой интерес к 64-битной ;теперь.Это не слишком хорошо сочетается с «Desktop» в вашем описании;но я также думаю, что через 5-10 лет тип устройств, на которых мы пишем программное обеспечение, также кардинально изменится.Таблетки нельзя игнорировать;люди хотят, чтобы на них запускались приложения на C # и Java, учитывая, что Microsoft официально перенесла Windows 8 в ARM.

  2. Если вы хотите начать использовать long;преуспевать.Нет причин не делать этого.Если мы только смотрим на процессор (игнорируя объем хранилища) и делая предположения, что мы находимся на архитектуре x86-64, то это не имеет большого значения.

  3. Предполагая, что мыпридерживаются архитектуры x86;это тоже правда.Вы можете получить немного больший стек;в зависимости от того, какую платформу вы используете.

5 голосов
/ 31 июля 2011

Если вы работаете на 64-битном процессоре и скомпилировали свой код для 64-битной системы, то, по крайней мере, в некоторых случаях long может быть более эффективным, поскольку он соответствует размеру регистра.Но будет ли что действительно повлиять на вашу программу намного спорно.Кроме того, если вы используете long повсеместно, вы, как правило, будете использовать больше памяти - как в стеке, так и в куче - что может негативно повлиять на производительность.Слишком много переменных, чтобы точно знать, насколько хорошо ваша программа будет работать, используя long по умолчанию вместо int.Есть причины, почему это может быть быстрее, и причины, почему это может быть медленнее.Это может быть полная стирка.

Обычная вещь, которую нужно сделать, это просто использовать int, если вас не волнует размер целого числа.Если вам нужно 64-разрядное целое число, тогда вы используете long.Если вы пытаетесь использовать меньше памяти, а int - это гораздо больше, чем нужно, тогда вы используете byte или short.

x86_64. ЦП будут рассчитаны на эффективную обработку 32.-битные программы, поэтому использование int не приведет к серьезному снижению производительности.Некоторые вещи будут быстрее из-за лучшего выравнивания при использовании 64-битных целых чисел на 64-битном процессоре, но другие будут медленнее из-за повышенных требований к памяти.И, вероятно, существует множество других факторов, которые могут определенно повлиять на производительность в любом направлении.

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

Лично я бы посоветовал вам следовать типичному маршруту использования int, когда вас не волнует размерцелое число и использовать другие типы, когда вы делаете.

4 голосов
/ 28 июля 2011

Извините за ответ C ++.

Если размер типа имеет значение, используйте тип размера:

  • uint8_t
  • int32_t
  • int64_t
  • и т.д.

Если размер не имеет значения, используйте выразительный тип:

  • size_t
  • ptrdiff_t
  • ssize_t
  • и т.д.

Я знаю, что у D есть типоразмеры и size_t. Я не уверен насчет Java или C #.

...