Вы должны использовать типы int или unsigned int для своих расчетов. Использование меньших типов только для соединений (структур / массивов). Причина этого заключается в том, что int обычно определяется как «наиболее естественный» интегральный тип для процессора, а для всех других производных типов может потребоваться обработка для правильной работы. В нашем проекте мы скомпилировали с помощью gcc на Solaris для SPARC случай, когда доступ к 8 и 16-битной переменной добавил инструкцию к коду. При загрузке меньшего типа из памяти он должен был убедиться, что верхняя часть регистра была правильно установлена (расширение знака для подписанного типа или 0 для неподписанного). Это удлинило код и увеличило нагрузку на регистры, что ухудшило другие оптимизации.
У меня есть конкретный пример:
Я объявил две переменные структуры как uint8_t и получил этот код в Sparc Asm:
if(p->BQ > p->AQ)
было переведено в
ldub [%l1+165], %o5 ! <variable>.BQ,
ldub [%l1+166], %g5 ! <variable>.AQ,
and %o5, 0xff, %g4 ! <variable>.BQ, <variable>.BQ
and %g5, 0xff, %l0 ! <variable>.AQ, <variable>.AQ
cmp %g4, %l0 ! <variable>.BQ, <variable>.AQ
bleu,a,pt %icc, .LL586 !
И вот что я получил, когда объявил две переменные как uint_t
lduw [%l1+168], %g1 ! <variable>.BQ,
lduw [%l1+172], %g4 ! <variable>.AQ,
cmp %g1, %g4 ! <variable>.BQ, <variable>.AQ
bleu,a,pt %icc, .LL587 !
На две арифметические операции меньше и на 2 больше регистров для других вещей