Есть много вопросов, которые задают разницу между целыми типами short
и int
в С++, но практически, когда вы выбираете short
over int
?
Когда использовать `short` над` int`?
Ответ 1
(Подробнее см. Эрик)
Примечания:
- Как правило,
int
устанавливается в "натуральный размер" - целочисленную форму, которую аппаратное обеспечение обрабатывает наиболее эффективно - При использовании
short
в массиве или в арифметических операциях целое числоshort
преобразуется вint
, и поэтому это может привести к удару по скорости обработкиshort
целых чисел - Использование
short
может сохранить память, если она ужеint
, что может быть важно при использовании большого массива - Ваша программа будет использовать больше памяти в 32-разрядной системе
int
по сравнению с 16-разрядной системойint
Вывод:
- Используйте
int
, если вы не сохраняете память, является критическим, или ваша программа использует много памяти (например, много массивов). В этом случае используйтеshort
.
Ответ 2
Вы выбираете short
над int
, когда:
Либо
- Вы хотите уменьшить объем памяти сохраняемых значений (например, если вы настроите таргетинг на платформу с низкой памятью),
- Вы хотите увеличить производительность за счет увеличения количества значений, которые могут быть упакованы на одну страницу памяти (уменьшение ошибок страницы при доступе к вашим значениям) и/или в кэшах памяти (уменьшение промахов в кеше при доступе к значениям) и профилирование показало, что здесь есть выгоды от производительности,
- Или вы отправляете данные по сети или сохраняете их на диске, и хотите уменьшить свой размер (чтобы уменьшить дисковое пространство или пропускную способность сети). Хотя для этих случаев вам следует выбирать типы, которые точно определяют размер в битах, а не
int
илиshort
, которые могут варьироваться в зависимости от платформы (так как вы хотите, чтобы платформа с 32-разряднымshort
могла прочитайте файл, написанный на платформе с 16-разряднымshort
). Хорошими кандидатами являются типы, определенные в stdint.h.
и
- У вас есть числовое значение, которое не требует каких-либо значений, которые не могут быть сохранены в
short
на вашей целевой платформе (для 16-разрядногоshort
, это-32768
-32767
, или0
-65535
для 16-разрядногоunsigned short
). - Ваша целевая платформа (или одна из ваших целевых платформ) использует меньше памяти для
short
, чем дляint
. Стандарт гарантирует, чтоshort
не большеint
, поэтому реализациям разрешено иметь одинаковый размер дляshort
и дляint
.
Примечание:
char
также может использоваться как арифметические типы. Ответ на вопрос "Когда следует использовать char
вместо short
или int
?" будет выглядеть очень похоже на этот, но с разными номерами (-128
- 127
для 8-разрядного char
, 0
- 255
для 8-разрядного unsigned char
)
Ответ 3
В общем, вы не предпочитаете short
над int
.
Тип int - размер родного слова процессора
Обычно int
- размер слова процессора.
Например, с 32-разрядным процессором размера слова, int
будет 32 бит. Процессор наиболее эффективен с использованием 32-битных. Предполагая, что short
- 16 бит, процессор по-прежнему извлекает 32-битные данные из памяти. Таким образом, никакой эффективности здесь нет; на самом деле это больше, потому что процессору, возможно, придется сдвинуть биты, которые будут помещены в правильное положение в 32-битное слово.
Выбор меньшего типа данных
Существуют стандартизованные типы данных, длина которых зависит от длины, например uint16_t
. Они предпочтительнее двусмысленных типов char, short,
и int
. Эти типы данных, специфичные для этой ширины, обычно используются для доступа к аппаратным средствам или для сжатия пространства (например, протоколов сообщений).
Выбор меньшего диапазона
Тип данных short
основан на диапазоне, а не на ширине бита. В 32-битной системе оба short
и int
могут иметь одинаковую 32-битную длину.
Как только причина использования short
заключается в том, что значение никогда не пройдет мимо заданного диапазона. Обычно это ошибка, потому что программы будут меняться и тип данных может переполняться.
Резюме
В настоящее время я больше не использую short
. Я использую uint16_t
, когда я обращаюсь к 16-разрядным аппаратным устройствам. Я использую unsigned int
для величин, включая индексы цикла. Я использую uint8_t
, uint16_t
и uint32_t
, когда размер имеет значение для хранения данных. Тип данных short
неоднозначен для хранения данных, поскольку он является минимальным. С появлением заголовочных файлов stdint
больше не требуется short
.
Ответ 4
Если у вас нет каких-либо конкретных ограничений, налагаемых вашей архитектурой, я бы сказал, что вы всегда можете использовать int
. Тип short
предназначен для конкретных систем, где память является ценным ресурсом.