Преимущества определения функции, принимающей 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 все еще ищу спецификацию, так что пока это мое мнение.

Другие вопросы по тегам