Как правило, большинство арифметических операций в C выполняется с использованием типа int
(то есть обычного int
, а не short
или long
).Это потому, что (а) определение C говорит так, что связано с тем фактом, что (b) именно так предпочитают работать многие процессоры (по крайней мере, те, о которых думали дизайнеры C).
Поэтому, если вы попытаетесь «сэкономить место», используя вместо этого short
ints, и напишите что-то вроде
short a = 1, b = 2;
short c = a + b;
, компилятор должен выдать код для преобразования a
из short
в int
, преобразовать b
из short
в int
, выполнить сложение и преобразовать сумму обратно в short
.Возможно, вы сэкономили немного места в хранилище для a
, b
и c
, но ваш код, вероятно, будет больше (и медленнее).
Если вы вместо этого напишите
int a = 1, b = 2;
int c = a + b;
вы тратите немного больше места на a
, b
и c
, но код, вероятно, меньше и быстрее.
Это несколько упрощенноаргумент, но вы заметили, что использование типа short
редко, и обычно рекомендуется простой int
.По сути, поскольку это «естественный» размер машины, предполагается, что это самый простой тип для арифметики, без дополнительных преобразований в менее натуральные типы.Это своего рода аргумент «Когда в Риме, делай, как делают римляне», но обычно делает выгодным использование простого int
.
Если у вас есть лоты с не очень большими целыми числами для хранения, с другой стороны (большой массив из них или большой массив структур, содержащих не очень большие целые числа), экономия хранения данных может быть большой и того стоитторгуется против (относительно меньшего) увеличения размера кода и потенциального увеличения скорости.
См. также этот предыдущий вопрос SO и эту запись C C FAQ .
Приложение: как и любая проблема оптимизации, если вы действительно заботитесь об использовании пространства данных, пространства кода и скорости кода, вам необходимо выполнить тщательные измерения, используя свой точный компьютер и процессор.В конце концов, вашему процессору может не потребоваться никаких «дополнительных инструкций преобразования» для преобразования в / из более мелких типов, поэтому их использование может быть не таким уж большим недостатком.Но в то же время вы, вероятно, можете подтвердить, что для изолированных переменных их использование также может не дать какого-либо ощутимого преимущества.
Приложение 2. Вот точка данных.Я экспериментировал с кодом
extern short a, b, c;
void f()
{
c = a + b;
}
, который я скомпилировал с двумя компиляторами, gcc и clang (компиляция для процессора Intel на Mac).Затем я изменил short
на int
и снова скомпилировал.int
-используемый код был на 7 байтов меньше при gcc и на 10 байтов меньше при clang.Проверка вывода на ассемблере позволяет предположить, что разница заключалась в урезании результата для его сохранения в c
;выборка short
в отличие от int
, по-видимому, не меняет счетчика команд.
Однако затем я попытался вызвать двух разных версий и обнаружил, что он практически не делаетРазница во времени выполнения даже после 10000000000 звонков.Таким образом, «использование short
может сделать код больше», часть ответа подтверждена, но, возможно, нет «, а также сделать его медленнее».