Почему целое число всегда используется в качестве управляющей переменной в цикле for?

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

Почему мы используем int, который занимает 32 бита (с большинством языков), когда достаточно что-то вроде байта, который составляет всего 8 бит.

Я знаю, что у нас есть 32-битные и 64-битные процессы, поэтому мы можем легко получить значение за одну поездку, но он по-прежнему потребляет больше памяти. Или я что-то упускаю?

обновление: Просто чтобы прояснить. Я знаю, что с точки зрения скорости разницы нет. Я спрашиваю о влиянии на потребление памяти.

6 ответов


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

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

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


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

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

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


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

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


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

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


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

для целей Java модель памяти языка программирования, a одиночная запись в энергонезависимый long или двойное значение рассматривается как два отдельные записи: по одному на каждый 32-бит половина. Это может привести к ситуации, где нить видит первые 32 бита 64-битного значения из одной записи и второй 32 бит из другого письма. Пишет и читает volatile long и двойные значения всегда атомарны. Записи и чтения ссылок всегда атомарный, независимо от того, они реализованы как 32 или 64 бит ценности. ВМ реализаторы рекомендуется чтобы избежать разделения их 64-разрядных значений там, где это возможно. Программисты рекомендуется объявить общий 64-бит значения как volatile или synchronize их программы правильно избегать вероятный осложнения.

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


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

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

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