Какой числовой тип выбрать для небольших счетчиков циклов?

Учтите, что int занимает 4 байта в памяти.

чтобы понять, что я ищу, возьмите этот пример:

for(x=0;x<10;x++) //do something

в этом для команды я знаю, что значение x меньше 11,

Я видел много кода, и большинство людей объявляют x как int,

почему мы не должны или почему большинство людей не объявляет x как короткий или даже как char!!

Я подумал по этой причине, и я нашел это объяснение, например:

short s=5;

s берут 2 байта в памяти, и я знаю, что компилятор рассматривает 5 как int поэтому для 5: s, 5 следует преобразовать в короткий правый!!

- > , поэтому эта инструкция занимает меньше памяти, но больше работает

int i=5;

здесь i берут 4 байта, но не нуждаются в разговоре ( 5 - это int)

- > , поэтому эта инструкция делает меньше работы, но занимает больше памяти

- это причина того, что я думал!

Я надеюсь, что мой вопрос был ясен

Ответ 1

Если вам нужно хранить миллионы чисел в памяти, и каждый номер может быть между 0 и 11, тогда вы будете иметь дело с памятью. В цикле переменная, скорее всего, хранится в регистре CPU, что означает, что это, например, 32-разрядная на x86 или 32 до 64 бит на x86_64 и т.д. Все "меньшие" целые числа будут иметь нулевое расширение до 32 или 64 бит в любом случае.

int прост и читабельен, поэтому многие люди его используют. Но если вы должны беспокоиться о производительности или намекать компилятору о ограничениях по размеру, используйте типы "(u) int_fast_ *" (т.е. uint_fast8_t.

Ответ 2

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

Например, вы беспокоитесь о памяти, которую принимает переменная цикла. Однако во многих циклах переменная цикла никогда не будет храниться в памяти. Вместо этого он будет храниться в реестре. Количество регистров в ЦПУ ограничено, но переменные не могут занимать половину регистра (обычно - x86 там немного странно), поэтому, если вы используете int, short или char, вы, вероятно, потеряете полный регистр. Поэтому вы ничего не спасите, уменьшив переменную.

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

Ответ 3

Лучшая причина для всей читаемости. Если бы я увидел цикл, повторяющийся через short или char, я потратил бы немного времени, чтобы понять, почему. int более интуитивно понятен, потому что он наиболее часто используемый тип для итерации (еще более используется iterator или size_t).

Ответ 4

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

Ответ 5

"Plain ints имеют естественный размер, предложенный архитектурой среды исполнения" 1 что означает, что в типичном случае простой int является типом, который накладывает наименьшую работу на процессор манипулировать и работать. Короче говоря, int - это тип по умолчанию, который вы обычно хотите использовать, когда у вас нет веской причины использовать что-то еще.

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


  • §3.9.1/2 в n1337, но все стандарты для C и С++, полностью возвращенные к исходному стандарту ANSI C89, имеют практически идентичную формулировку, хотя номера разделов изменились.

Ответ 6

Нет, не полностью. Если у вас есть полуразмерный компилятор, это будет правильно работать. Используйте короткий, если вы обеспокоены использованием памяти, и оставьте это на этом.

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

См. этот вопрос.

Ответ 7

Вы можете встретить код, когда вам нужно зацикливаться на большее число. чем может быть char или даже short. Это может быть ситуация, когда вы кодируете, например, базу данных, такую ​​как системы, где цикл занимает огромные числа. Чтобы быть на более безопасной стороне, полезно взять переменную цикла как "int". Еще одна вещь, если вы используете такой цикл для чего-то вроде функции Delay_ms(), и если вы попытаетесь ограничить переменную цикла до char, вам придется иметь вложенные циклы или вызвать ту же функцию Delay_ms() опять и опять.