Это действительно зависит от того, что делает ваш цикл. Возьмем этот цикл, например:
typedef struct _SomeData
{
/* some data here */
} SomeData;
void SomeFunction (SomeData *array_of_data, int number_of_elements)
{
int i;
for (i = 0 ; i < number_of_elements ; ++i)
{
DoSomethingWithData (&array_of_data [i]);
}
}
Некоторые компиляторы хорошо поработают над оптимизацией вышеперечисленного. Но некоторые компиляторы, особенно компиляторы для нишевых встроенных микропроцессоров, будут генерировать ужасно неэффективный код. Это может быть переписано как:
void SomeFunction (SomeData *array_of_data, int number_of_elements)
{
SomeData *current = array_of_data, *end = &array_of_data [number_of_elements];
while (current < end)
{
DoSomethingWithData (current++);
}
}
, который вообще не использует целые числа и с большей вероятностью будет генерировать хороший вывод независимо от компилятора (современные компиляторы в любом случае, скорее всего, оптимизируют целочисленную версию до чего-то подобного приведенному)
Итак, целые числа не всегда необходимы для циклов, и лучшая оптимизация всегда состоит в том, чтобы не делать то, что не нужно. Однако, если в цикле явно требуется целое число, тип int обычно обеспечивает лучший результат.
Конечно, вы всегда должны использовать профилировщик, чтобы быть уверенным в производительности кода и в том, имеет ли какое-либо значение изменение типа.