Когда использовать `short` над` int`?
Есть много вопросов, которые задают разницу между целыми типами short
и int
в С++, но практически, когда вы выбираете short
over 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
предназначен для конкретных систем, где память является ценным ресурсом.