Лучше ли использовать целые числа в качестве переменных счетчика цикла? - PullRequest
11 голосов
/ 11 февраля 2010

Я помню, что читал где-то, что лучше использовать целые числа в качестве переменных счетчика цикла, а не char или short. Если да, то почему? Это дает какие-либо преимущества оптимизации?

Ответы [ 11 ]

14 голосов
/ 11 февраля 2010

Обычно компилятор делает int подходящим размером для включения в один из регистров общего назначения вашего ЦП. Как правило, это приводит к быстрому доступу.

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

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

8 голосов
/ 11 февраля 2010

В 32-битной архитектуре операции с 4-байтовыми (int) переменными обычно выполняются быстрее. Это в основном связано с размером регистров и выравниванием памяти. В 64-битной архитектуре int будет (должен) автоматически делаться 64-битным целым числом.

4 голосов
/ 11 февраля 2010

Алексей * прав, обычно быстрее использовать тип такой же ширины, что и архитектура (то есть int32 для 32-битной системы)

Кроме того, если вы используете символ, т.е.

for(char i=0;i<max;++i)

есть небольшая вероятность, что вы (или коллега) вернетесь к коду через месяц и измените max на что-то высокое, что приведет к переполнению и раздражающей ошибке;)

Sam

* и все остальные, кто ответил, когда я писал это!

3 голосов
/ 11 февраля 2010

Можно ожидать, что тип int будет самым быстрым реализованным целочисленным типом на вашей платформе и поэтому должен быть выбором по умолчанию.

Из K & R, 2-е издание, с. 36:

int: целое число, обычно отражающее натуральный размер целых чисел на хост-компьютере.

2 голосов
/ 11 февраля 2010

Беспокойся о том, как правильно устроить свои петли, прежде чем беспокоиться об этом. Скорее всего, в границах цикла у вас будет ошибка «по одному», чем измеримая разница в скорости или размере кода, если изменить тип счетчика цикла между int, char или short. Так что сначала беспокойтесь о правильности.

Тем не менее, по умолчанию используется int или unsigned int, если у вас нет причин поступать иначе - но я говорю это потому, что вам вряд ли придется беспокоиться о переполнении или переносе с большим типом, а не потому, что может быть быстрее (даже если это возможно).

2 голосов
/ 11 февраля 2010

Вы когда-нибудь замечали, что стандарт C довольно сомнителен относительно размера целых чисел? Этот факт приводит в замешательство инженеров драйверов устройств и тех, кто работает над протоколами связи, поскольку они считают, что язык должен четко определять размер объектов.

C говорит, что int - это естественный размер для архитектуры реализации. Это означает, что он будет обрабатываться по крайней мере так же эффективно, как и любой другой размер. Возьмем архитектуру x86: short (16-разрядное целое число), используемое в 32-разрядной программе, содержит инструкции, выполняющие дополнительную модификацию «переопределения размера». Таким образом, код имеет больше байтов, хотя обычно без потери производительности. Если только дополнительные байты не вызывают переполнение строки кэша ...

Сгенерированный x86-код для счетчика char обычно включает маскирование после приращения, чтобы гарантировать, что оно останется 8 битами. Может показаться, что использование переменной меньшего размера будет меньше и труднее, но это не относится к x86 и некоторым другим распространенным процессорам.

2 голосов
/ 11 февраля 2010

Было бы еще лучше использовать тип size_t для счетчиков циклов. Он будет масштабироваться до 64 бит.

1 голос
/ 11 февраля 2010

Обычно int является правильным выбором для зацикливания. Есть две причины, по которым это может быть не так:

  1. Может быть больше, чем необходимо. SDCC поддерживает некоторые 8-битные процессоры, такие как Z80, которые обеспечивают 8-битный доступ к регистрам, хотя sizeof (int) = 2. Если вам не нужно больше 8 бит для вашей переменной цикла, то использование символов с sizeof (char) = 1 позволяет оптимизатору втиснуть больше в регистровое пространство, что приводит к ускорению кода.
  2. Это может быть слишком мало. Если целые числа 16 бит, то у вас вполне могут быть циклы, которые выполняются более чем много раз.

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

1 голос
/ 11 февраля 2010

Это действительно зависит от платформы, для которой вы пишете код. Лучший тип для использования, чтобы соответствовать его вашей платформе. То есть, если вы пишете код для простого 8-битного микро, возможно, лучше использовать uint8_t, чем uint16_t.

1 голос
/ 11 февраля 2010

В некоторых случаях проблемы переполнения с char s (или даже short s) приводят к бесконечным циклам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...