Нет никакого объективного значения «самый быстрый»;это в основном суждение автора компилятора.Как правило, это означает расширение меньших значений до собственной ширины регистра архитектуры, но это не всегда самый быстрый (например, массив из 1 миллиарда записей, вероятно, будет обработан быстрее, если бы это были 8-битные значения, но uint_fast8_t
может быть 32-битным значением, потому что манипуляции с регистром ЦП выполняются быстрее для этого размера).
«самый маленький» обычно означает «тот же размер, что и запрошенные биты», но на странных архитектурах сограниченные значения размера на выбор (например, старые Crays имели все как 64-битный тип), int_least16_t
будет работать (и без проблем станет 64-битным значением), в то время как компилятор, скорее всего, выдаст ошибку int16_t
(потому что там невозможно получить истинное 16-битное целочисленное значение).
Дело в том, что если вы полагаетесь на поведение переполнения, вам нужно использовать точный тип фиксированной ширины.В противном случае вам, вероятно, следует по умолчанию использовать least
типы для максимальной переносимости, переключаясь на fast
типы в путях быстрого кода, но профилирование потребуется, чтобы определить, действительно ли оно имеет какое-либо значение.