It seems that uint32_t
is much more prevalent than uint_fast32_t
(I realise this is anecdotal evidence). That seems counter-intuitive to me, though.
One reason is that unsigned int
is already "fastest" without the need for any special typedefs or the need to include something. So, if you need it fast, just use the fundamental int
or unsigned int
type.
While the standard does not explicitly guarantee that it is fastest, it indirectly does so by stating "Plain ints have the natural size suggested by the architecture of the execution environment" in 3.9.1. In other words, int
(or its unsigned counterpart) is what the processor is most comfortable with.
Now of course, you don't know what size unsigned int
might be. You only know it is at least as large as short
(and I seem to remember that short
must be at least 16 bits, although I can't find that in the standard now!). Usually it's just plain simply 4 bytes, but it could in theory be larger, or in extreme cases, even smaller (although I've personally never encountered an architecture where this was the case, not even on 8-bit computers in the 1980s... maybe some microcontrollers, who knows turns out I suffer from dementia, int
was very clearly 16 bits back then).
The C++ standard doesn't bother to specify what the
types are or what they guarantee, it merely mentions "same as in C".
uint32_t
, per the C standard, guarantees that you get exactly 32 bits. Not anything different, none less and no padding bits. Sometimes this is exactly what you need, and thus it is very valuable.
uint_least32_t
guarantees that whatever the size is, it cannot be smaller than 32 bits (but it could very well be larger). Sometimes, but much more rarely than an exact witdh or "don't care", this is what you want.
Lastly, uint_fast32_t
is somewhat superfluous in my opinion, except for documentation-of-intent purposes. The C standard states "designates an integer type that is usually fastest" (note the word "usually") and explicitly mentions that it needs not be fastest for all purposes. In other words, uint_fast32_t
is just about the same as uint_least32_t
, which is usually fastest too, only no guarantee given (but no guarantee either way).
Since most of the time you either don't care about the exact size or you want exactly 32 (or 64, sometimes 16) bits, and since the "don't care" unsigned int
type is fastest anyway, this explains why uint_fast32_t
isn't so frequently used.