2013-09-30 6 views
1

Я читаю здесь Benefit of using short instead of int in for... loop, что на самом деле не имеет смысла использовать короткие, а не простые int в цикле, поскольку в большинстве архитектур короткие будут занимать тот же объем памяти, что и внутр. Это заставляет меня думать, что короткие ints действительно не полезны, потому что они не приводят к тому, что можно ожидать, это сохранение памяти. Однако в производственном коде я часто вижу, что короткие ints используются как аргументы функции. Например, когда я просматривал coreboot (coreboot.org) с помощью ack-grep, я нашел много функций, которые занимают короткие позиции. Я понимаю, что код Coreboot довольно низкоуровневый, но мне интересно, какая польза, если таковая имеется, в использовании короткого, а не int в C на архитектуре x86? Когда я должен его использовать?Преимущества определения функции, принимающей short int вместо int

+3

Самое большое преимущество использования 'short' приходит, когда они используются в совокупности - в массиве' short' IOW - поскольку этот массив занимает половину пространства массива 'int'. Другое возможное преимущество заключается в том, что если функция определена как «короткая», вы знаете, что значение будет находиться в диапазоне -32768 .. + 32767 (для систем с целыми числами 2 и 16-разрядным «коротким», что это большинство систем), которые могут упростить ваши процессы проверки внутри функции. В противном случае переменные типа 'short' не очень помогают, если вы не соответствуете внешней спецификации какого-либо типа. –

+0

@JonathanLeffler почему бы не сделать это ответом? – ouah

+0

«Процесс проверки» - вы имеете в виду проверку переполнения? Как сделать это проще? – user1042840

ответ

1

Некоторые функции предназначены для short и других для int.

Если кто-то хочет, чтобы сосчитать все биты, установленные в short можно было бы использовать

int CountBits_short(short x); 

Если кто-то хочет считать все биты, установленные в int можно было бы использовать

int CountBits_int(int x); 

Eсть не проблема производительности здесь, просто функциональная разница.


@JonathanLeffler комментарий к OP подводит итог наиболее полезной Причины 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 все еще ищет spec def, так что пока это мое мнение.

2

Самое большое преимущество использования short приходит тогда, когда они используются в совокупности — в основном в массиве short IOW, или, возможно, в качестве членов структуры ‐ как массив short обычно занимает половину пространства массива int с таким же количеством записей.

Другим возможным преимуществом является то, что если функция определена для принятия short, вы знаете, что значение будет находиться в диапазоне -32768 .. + 32767 (в системах с целыми числами 2 и 16-битным short, что это большинство систем), которые могут упростить ваши процессы проверки внутри функции. Если пройденный тип был int вместо short, но диапазон допустимых значений -32788 .. + 32767, тогда вам нужно будет проверить, что переданное значение находилось в диапазоне (при условии, что sizeof(int) > sizeof(short), что не гарантируется, но является типичным).

В противном случае переменные типа short не помогут вам, если вы не соответствуете внешней спецификации какого-либо рода.

+0

+1 для не сказать sizeof (int) всегда> sizeof (короткий). Встраиваемые системы сегодня являются заметным использованием, где они часто бывают одинаковыми. – chux

Смежные вопросы