Что такое 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 бит может произойти во время команды загрузки, а идея о том, что существует "собственный" целочисленный формат, который быстрее, старомодный.