Что такое uint_fast32_t и почему его следует использовать вместо обычных int и uint32_t?

Таким образом, причиной для typedef: ed примитивных типов данных является абстрагирование представления низкого уровня и упрощение понимания (uint64_t вместо типа long long, который составляет 8 байтов).

Однако существует uint_fast32_t, у которого тот же typedef, что и uint32_t. Будет ли использование "быстрой" версии ускорить выполнение программы?

Ответ 1

  • int может быть как 16 бит на некоторых платформах. Это может быть недостаточно для вашего приложения.
  • uint32_t не гарантируется. Это необязательный typedef, который реализация должна обеспечить, если он имеет целочисленный тип без знака ровно 32 бит. Например, у некоторых есть 9-битные байты, поэтому они не имеют uint32_t.
  • uint_fast32_t четко заявляет о своем намерении: это тип не менее 32 бит, который лучше всего подходит для точки зрения производительности. uint_fast32_t может быть на самом деле длиной 64 бит. Это до реализации.

... существует uint_fast32_t, который имеет тот же typedef, что и uint32_t...

То, что вы смотрите, не является стандартом. Это особая реализация (BlackBerry). Поэтому вы не можете сделать вывод, что uint_fast32_t всегда совпадает с uint32_t.

См. также:

Ответ 2

Разница заключается в их точности и доступности.

doc здесь говорит:

беззнаковый целочисленный тип с шириной точно 8, 16, 32 и 64 бит соответственно (предоставляется только в том случае, если реализация напрямую поддерживает тип):

uint8_t
uint16_t
uint32_t
uint64_t

и

самый быстрый беззнаковый целочисленный тип без знака с шириной не менее 8, 16, 32 и 64 бит соответственно

uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t    

Таким образом, разница в значительной степени очевидна: uint32_t - это тип, который имеет точно 32 биты, и реализация должна предоставить его, только если он имеет тип с ровно 32 битами, а затем он может ввести typedef в качестве uint32_t. Это означает, что uint32_t может быть или не быть доступным.

С другой стороны, uint_fast32_t - это тип, который имеет не менее 32 бита, что также означает, что реализация может typedef uint32_t как uint_fast32_t , если он предоставляет uint32_t. Если он не предоставляет uint32_t, то uint_fast32_t может быть typedef любого типа, который имеет не менее 32 бит.

Ответ 3

Когда вы #include inttypes.h в своей программе, вы получаете доступ к множеству различных способов представления целых чисел.

Тип uint_fast * _t просто определяет самый быстрый тип для представления заданного количества бит.

Подумайте об этом так: вы определяете переменную типа short и используете ее несколько раз в программе, что является полностью допустимым. Однако система, над которой вы работаете, может быстрее работать со значениями типа int. Определяя переменную как тип uint_fast*t, компьютер просто выбирает наиболее эффективное представление, с которым он может работать.

Если между этими представлениями нет разницы, система выбирает то, что хочет, и использует ее последовательно.

Ответ 4

Обратите внимание, что быстрая версия может быть больше 32 бит. В то время как быстрый int будет хорошо вписываться в регистр и быть выровненным и тому подобное: но он будет использовать больше памяти. Если у вас есть большие массивы, ваша программа будет медленнее из-за большего количества обращений к памяти и пропускной способности.

Я не думаю, что современный CPUS выиграет от fast_int32, так как в общем случае расширение знака от 32 до 64 бит может произойти во время команды загрузки, а идея о том, что существует "собственный" целочисленный формат, который быстрее, старомодный.