Преимущества определения функции, принимающей short int вместо int
Я прочитал здесь Преимущество использования short вместо int в цикле for..., что на самом деле не имеет смысла использовать short вместо обычного int в счетчиках цикла, потому что в большинстве архитектур short будет занимать тот же объем памяти, что и int. Это заставляет меня думать, что короткие целые числа действительно бесполезны, потому что они не приводят к тому, что можно ожидать, то есть к экономии памяти. Однако в производственном коде я часто вижу, что короткие аргументы используются в качестве аргументов функции. Например, когда я просматривал coreboot (coreboot.org) с помощью ack-grep, я обнаружил, что многие функции не работают. Я понимаю, что код coreboot довольно низкоуровневый, но мне интересно, каково преимущество использования short вместо int в C на архитектуре x86? Когда я должен использовать это?
2 ответа
Самое большое преимущество использования short
приходит, когда они используются в совокупности - в основном в массиве short
IOW, или, возможно, как члены структуры - как массив short
обычно занимает половину пространства массива int
с таким же количеством записей.
Другое возможное преимущество заключается в том, что если функция определена для short
вы знаете, что значение будет в диапазоне -32768..+32767 (в системах с целыми числами дополнения 2 и 16-разрядными short
, что в большинстве систем), что может упростить ваши процессы проверки внутри функции. Если переданный тип был int
вместо short
но диапазон допустимых значений -32788..+32767, тогда вам нужно будет проверить, что переданное значение находится в диапазоне (при условии, sizeof(int) > sizeof(short)
, что не гарантировано, но типично).
В противном случае переменные типа short
не очень много помощи, если вы не соответствуете какой-либо внешней спецификации.
Некоторые функции предназначены для short
и другие для int
,
Если кто-то хотел посчитать все биты, установленные в short
один будет использовать
int CountBits_short(short x);
Если кто-то хотел посчитать все биты, установленные в int
один будет использовать
int CountBits_int(int x);
Здесь проблема не в производительности, а в функциональной разнице.
@JonathanLeffler комментарий к ОП подводит итог наиболее полезной причине для short
они могут занимать меньше места.
Другой
Другие мысли:
На платформах где sizeof(int) == sizeof(short)
нет никакого выигрыша в производительности.
В противном случае мы знаем sizeof(int) > sizeof(short)
,
Компилятор может создать аналогичный код входа / выхода для следующего и без разницы в производительности.
void foo_s(short bar);
void foo_i(int bar);
Попутно указатель как в
void foo_s(short *bar);
void foo_i(int *bar);
sizeof(bar)
то же самое, поскольку это адрес, опять же нет никакой выгоды в передаче дополнения.
В проходящих массивах, как в
void foo_s(short bar[]);
void foo_i(int bar[]);
bar
становится адресом первого элемента, снова того же размера, поскольку это адрес, опять же, нет никакой выгоды в передаче дополнения.
Выполнение функций, которые используют short
номинально считается чуть хуже, чем int
тем, что для продвижения / понижения между short
и процессор предпочтительнее int
, int
по определению *1 - номинально предпочтительный целочисленный размер процессора.
Конечно, любые проблемы с производительностью требуют профилирования для проверки, но суть в том, что short
используется для экономии места при потенциальной номинальной стоимости в производительности.
*1 все еще ищу спецификацию, так что пока это мое мнение.