Почему в большинстве примеров которые я смотрю в интернете для хранения в переменной целочисленного типа, в которой нужно хранить совсем небольшое значение например 10 или 50 используют int вместо short int, даже если просчеты точно не превысят short int все равно используют int, ведь это же логичнее зачем использовать 4 байта памяти когда можно использовать 2 байта, или людям просто лень писать short перед int. Есть ли в этом какая то разница?
Как одна из причин - работа с int
'ом обычно выполняется быстрее.
Ну, а экономия в 2 байта при нынешних объемах памяти для обычных задач несущественна.
Если же нужна какая-то специфика - ну, например, строго указанный размер для обмена информацией с другой программой/машиной, больший диапазон значений - словом, некоторые условия, где другой тип применять удобнее (вплоть до экономии памяти в программе, для которой это действительно важно) - тогда дело другое.
int
- это тип по-умолчанию.
Это будет самый оптимальный тип на целевой платформе - 2 байта на 16-разрядной, 4 байта на 32-разрядной, 4 или 8 байт на 64-рязрядной (в зависимости от ОС).
short int
требует генерации дополнительного кода на большинстве платформ - например преобразования в int
если соответствующая инструкция процессора не работает с short int
.
short int
может сэкономить место в массиве, но скорей всего не сэкономит место если это поле структуры, локальная переменная или аргумент функции - они будут выравниваться по размеру int
или больше.
Людям лень, это тоже причина. Но есть и другие, как например то, что в любом выражении short
будет всё равно преобразован к int
(integral promotion), т.е. имея переменную типа int
мы, потенциально, имеем меньший шанс того, что будет необходимо преобразование типа во время вычисления выражения.
Но я рискну предположить, что многие пишущие на C++ не догадываются об этой разнице и о том, какие там инструкции и что быстрее. Поэтому, на мой взгляд, основной причиной использования int
является привычка и лень, больше ничего. И дело тут не только в short
. К примеру, очень часто size_t
является более подходящим (с точки зрения семантики) типом, а люди всё равно используют int
.
Пытаться использовать 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). Выравнивание данных.
Скорее всего, большая часть просмотренных примеров фокусируются на чем-то еще, а не использовании наиболее подходящего типа данных. Соответственно используют int
просто потому, что это встроенный целочисленный тип по-умолчанию (да еще и самым коротким именем). В реальных проектах целочисленный тип во-первых подбирают исходя из диапазона хранимых значений, во-вторых вместо int
short
unsigned int
long
и т.п. используют библиотечные целочисленные типы фиксированной длины, например ::std::int16_t
или ::std::int32_t
, из заголовочного файла <cstdint>
и целочисленные типы для памяти, например ::std::size_t
или ::std::ptr_diff_t
, из заголовочного файла <cstddef>
.
Разнообразие используемых типов приводит к необходимости их преобразования, из чего вытекают всякие сложности и тонкие моменты. Поэтому, когда в разнообразии типов нет обоснованной необходимости, то стараются это разнообразие сократить.
Собственно, бритва Оккама в чистом виде: "Не следует множить сущее без необходимости".
А int лучше всего подходит для основной массы целочисленных вычислений (в этом, собственно, его назначение, он оптимален для этого на данной машине). Поэтому обычно его и берут, если нет каких-то веских причин взять другой тип.
Причинами для выбора другого типа могут быть:
и так далее.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Можно ли вместо ZeroMemory(x,sizeof(x)) использовать Zero(x)?
Как корректно реализовывать функции-геттеры? Я имею ввиду возвращаемое значениеТак:
Пишу приложение, в котором необходимо, что бы картинка фона графической сцены постепенно менялась, скажем, с таймеромВ документации прочитал,...
Привет, делаю сайт визитку, затык на банальном вопросе не могу вставить изображение на фон только одной (главной) indexhtml страницы