Почему используют int вместо short int?

337
18 ноября 2017, 12:00

Почему в большинстве примеров которые я смотрю в интернете для хранения в переменной целочисленного типа, в которой нужно хранить совсем небольшое значение например 10 или 50 используют int вместо short int, даже если просчеты точно не превысят short int все равно используют int, ведь это же логичнее зачем использовать 4 байта памяти когда можно использовать 2 байта, или людям просто лень писать short перед int. Есть ли в этом какая то разница?

Answer 1

Как одна из причин - работа с int'ом обычно выполняется быстрее.

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

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

Answer 2

int - это тип по-умолчанию.

Это будет самый оптимальный тип на целевой платформе - 2 байта на 16-разрядной, 4 байта на 32-разрядной, 4 или 8 байт на 64-рязрядной (в зависимости от ОС).

short int требует генерации дополнительного кода на большинстве платформ - например преобразования в int если соответствующая инструкция процессора не работает с short int.

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

Answer 3

Людям лень, это тоже причина. Но есть и другие, как например то, что в любом выражении short будет всё равно преобразован к int (integral promotion), т.е. имея переменную типа int мы, потенциально, имеем меньший шанс того, что будет необходимо преобразование типа во время вычисления выражения.

Но я рискну предположить, что многие пишущие на C++ не догадываются об этой разнице и о том, какие там инструкции и что быстрее. Поэтому, на мой взгляд, основной причиной использования int является привычка и лень, больше ничего. И дело тут не только в short. К примеру, очень часто size_t является более подходящим (с точки зрения семантики) типом, а люди всё равно используют int.

Answer 4

Пытаться использовать short вместо int это преждевременная и/или неэффективная оптимизация как правило.

При выполнении арифметических операций малые типы (< rank) в int превращаются (или unsigned если в int не помещается значение) из-за integral promotions.

Объяснить зачем integral promotions в языке существуют можно так: int обычно имеет естественную ширину для процессора, поэтому меньше действий CPU обычно нужно сделать, чтобы сложить два int, по сравнению c short int. К примеру, код:

using U = unsigned short;
U add(U a, U b) {
  return a + b;
}

может скомпилироваться в:

leal    (%rsi,%rdi), %eax

то есть происходит фактически происходит операция над машинными словами (в AMD64 регистрах). Это происходит, даже если 8-битовые числа складывать.

CPU c памятью по словам работает (к примеру, 64-битные слова). Поэтому, доступ может быть быстрее, если данные расположены по адресу кратному размеру слова (data alignment). Компилятор может добавить дополнительные байты (ничего не значащие), чтобы выравнять данные по границе слова (padding) или упаковать несколько меньших элементов в одном слове (packing). Выравнивание данных.

Answer 5

Скорее всего, большая часть просмотренных примеров фокусируются на чем-то еще, а не использовании наиболее подходящего типа данных. Соответственно используют int просто потому, что это встроенный целочисленный тип по-умолчанию (да еще и самым коротким именем). В реальных проектах целочисленный тип во-первых подбирают исходя из диапазона хранимых значений, во-вторых вместо int short unsigned int long и т.п. используют библиотечные целочисленные типы фиксированной длины, например ::std::int16_t или ::std::int32_t, из заголовочного файла <cstdint> и целочисленные типы для памяти, например ::std::size_t или ::std::ptr_diff_t, из заголовочного файла <cstddef>.

Answer 6

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

Собственно, бритва Оккама в чистом виде: "Не следует множить сущее без необходимости".

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

Причинами для выбора другого типа могут быть:

  • Недостаточно широкий диапазон значений int;
  • Необходимость экономии памяти на больших массивах данных;
  • особенности конкретного прикладного протокола

и так далее.

READ ALSO
Как очистить массив через template?

Как очистить массив через template?

Можно ли вместо ZeroMemory(x,sizeof(x)) использовать Zero(x)?

263
Реализация функций-геттеров

Реализация функций-геттеров

Как корректно реализовывать функции-геттеры? Я имею ввиду возвращаемое значениеТак:

197
Как наиболее корректно обновлять фон QGraphicsScene?

Как наиболее корректно обновлять фон QGraphicsScene?

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

283
Сайт визитка html/css

Сайт визитка html/css

Привет, делаю сайт визитку, затык на банальном вопросе не могу вставить изображение на фон только одной (главной) indexhtml страницы

323