Таким образом, причина для typedef
примитивных типов данных: ed заключается в том, чтобы абстрагироваться от низкоуровневого представления и облегчить понимание ( uint64_t
вместо long long
типа, который составляет 8 байтов).
Однако uint_fast32_t
есть такой же, typedef
как uint32_t
. Сделает ли использование «быстрой» версии программу быстрее?
Ответы:
int
на некоторых платформах может быть всего 16 бит. Для вашего приложения этого может быть недостаточно.uint32_t
не гарантируется существование. Необязательноtypedef
, чтобы реализация была предоставлена, если она имеет беззнаковый целочисленный тип ровно 32 бита. Например, у некоторых есть 9-битные байты, поэтому у них нет файлаuint32_t
.uint_fast32_t
четко заявляет о ваших намерениях: это тип минимум 32 бита, который является лучшим с точки зрения производительности.uint_fast32_t
на самом деле может быть 64 бита. Все зависит от реализации.То, что вы смотрите, не является стандартом. Это конкретная реализация (BlackBerry). Таким образом, вы не можете вывести оттуда то
uint_fast32_t
же самое, что иuint32_t
.Смотрите также:
Экзотические архитектуры, о которых заботятся комитеты по стандартам .
Прагматический взгляд на целые типы в C и C ++, основанный на моем мнении .
источник
uint_least32_t
, которая такая же, какuint_fast32_t
за исключением того, что предпочитает меньший магазин, а не скорость.Отличие заключается в их точности и доступности.
Док здесь говорит:
И
Таким образом, разница довольно очевидна,
uint32_t
это тип, который имеет ровно32
биты, и реализация должна предоставлять его только в том случае, если он имеет тип ровно с 32 битами, а затем он может определить этот тип какuint32_t
. Это означает, чтоuint32_t
может или не может быть доступна .С другой стороны,
uint_fast32_t
это тип, который имеет как минимум 32 бита, что также означает, что реализация может typedef,uint32_t
какuint_fast32_t
если бы она обеспечивалаuint32_t
. Если он не предоставляетuint32_t
, то этоuint_fast32_t
может быть typedef любого типа, который имеет хотя бы32
биты.источник
uint32_t
точно 32-битный во всех системах (если он существует), что может быть не быстрее по сравнению с, скажем, 64-битным.uint_fast32_t
с другой стороны, как минимум 32-битный, может быть даже 64-битный.uint16_t x;
сохраняется в 32-битном регистре ARM7-TDMI, кодx++;
может быть оценен какx=((x+1)<<16)>>16);
. В компиляторах для этой платформы,uint_fast16_t
скорее всего, будет определен как синоним,uint32_t
чтобы избежать этого.[u]int_(fast|least)N_t
не являются необязательными? Разумеется, стандарт не требует, чтобы все архитектуры поддерживали примитивные типы размером не менее 64 бит? Однако формулировкаstdint.h
подразумевает, что они должны. Мне кажется странным, что мы добиваемся этого с 1999 года, за несколько лет до того, как 64-битные вычисления стали мейнстримом, не говоря уже об отставании от этого (во многих случаях все еще текущего) встроенных архитектур. Мне это кажется большой оплошностью.Находясь
#include inttypes.h
в своей программе, вы получаете доступ к множеству различных способов представления целых чисел.Тип uint_fast * _t просто определяет самый быстрый тип для представления заданного количества бит.
Подумайте об этом так: вы определяете переменную типа
short
и несколько раз используете ее в программе, что совершенно верно. Однако система, над которой вы работаете, может работать быстрее со значениями типаint
. Определяя переменную как типuint_fast*t
, компьютер просто выбирает наиболее эффективное представление, с которым он может работать.Если между этими представлениями нет никакой разницы, тогда система выбирает то, что ей нужно, и последовательно использует его.
источник
Обратите внимание, что быстрая версия может быть больше 32 бит. Хотя быстрый int хорошо впишется в регистр, будет выровнен и тому подобное: но он будет использовать больше памяти. Если у вас их большие массивы, ваша программа будет работать медленнее из-за большего количества обращений к кешу памяти и пропускной способности.
Я не думаю, что современный CPUS выиграет от fast_int32, поскольку обычно знак, расширяющийся с 32 до 64 бит, может произойти во время инструкции загрузки, и идея о том, что существует «родной» целочисленный формат, который работает быстрее, устарела.
источник