Почему целое число всегда используется в качестве управляющей переменной в цикле for? - PullRequest
16 голосов
/ 17 ноября 2010

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

ОБНОВЛЕНИЕ: Просто чтобы уточнить.Я осознаю, что в скорости нет разницы.Я спрашиваю о влиянии на потребление памяти.

Ответы [ 6 ]

27 голосов
/ 17 ноября 2010

В C "int" определяется как наиболее эффективный целочисленный тип для текущей машины.

Обычно он совпадает с регистрами ЦП, поэтому он наиболее эффективен.

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

8 голосов
/ 17 ноября 2010

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

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

Но, как всегда, используйте все, что наиболее читабельно, и в первую очередь бенчмарк / профиль ...

7 голосов
/ 17 ноября 2010

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

Чем больше стандарт моего кода, тем легче его читать в будущем.

6 голосов
/ 17 ноября 2010

Во многих случаях счетчик цикла использует ровно один регистр процессора.Изменение типа на 8- или 16-разрядное целое число не меняет этого, поскольку регистры имеют фиксированный размер (32 бита на 32-разрядной платформе и т. Д.).

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

4 голосов
/ 17 ноября 2010

С точки зрения спецификации языка Java есть интересное замечание по поводу использования long и double:

Для целей Java модель памяти языка программирования, одиночная запись в энергонезависимую длинную или двойное значение рассматривается как два отдельные записи: по одному на каждый 32-битный половина. Это может привести к ситуации где поток видит первые 32 бита 64-битного значения из одной записи, и вторые 32 бита от другой записи. Пишет и читает летучие длинные и двойные значения всегда атомарны. Пишет и читает ссылки всегда атомарный, независимо от того, они реализованы как 32 или 64 бит ценности. Разработчики виртуальных машин приветствуются чтобы не разбивать их 64-битные значения где возможно. Программисты рекомендуется объявить общий 64-битный значения как изменчивые или синхронизировать их программы правильно, чтобы избежать возможные осложнения.

Очевидно, что это делает использование long или double в вашей циклической переменной менее эффективным, чем int в модели памяти Java, но реализации могут отличаться по производительности.

0 голосов
/ 20 февраля 2014

Я испытываю желание добавить что-то здесь, даже если это очень старая тема.Я не полностью согласен с «Я знаю, что в скорости нет никакой разницы».Действительно, очень часто в цикле for происходит индексация массива, например в

for (i=0; i<len; i++) s = A[i]

. Тогда даже если размер вашего массива меньше 128, вы увидите заметную разницу в скорости, если i является int или byte.Действительно, чтобы выполнить арифметику указателей в A[i], процессор должен преобразовать ваше целое число во что-то, что имеет тот же размер, что и указатель.Если целое число уже имеет такой же размер, то нет преобразования, которое бы вызывало более быстрый код.На 64-битной машине я вижу ускорение программ на 20%, используя long int для индексов цикла в очень маленьком массиве вместо char (программы на C / C ++).

...