什么是uint_fast32_t,为什么要用它来代替常规的int和uint32_t?
因此, typedef
:ed原始数据types的原因是为了抽象低层表示,并使其更容易理解( uint64_t
而不是long long
types,即8个字节)。
但是, uint_fast32_t
与uint32_t
具有相同的typedef
。 将使用“快”版本使程序更快?
-
int
在某些平台上可能小至16位。 您的应用程序可能不够用。 -
uint32_t
不保证存在。 这是一个可选的typedef
,实现必须提供,如果它有一个无符号整数types正好32位。 有些例如有9位字节,所以他们没有uint32_t
。 -
uint_fast32_t
明确地uint_fast32_t
你的意图:这是一个至less 32位的types,从性能angular度来看是最好的。uint_fast32_t
实际上可能是64位长。 这取决于实施。
…有
uint_fast32_t
,它具有与uint32_t
相同的typedef …
你看的不是标准。 这是一个特殊的实现(黑莓)。 所以你不能从那里推断出uint_fast32_t
总是和uint32_t
相同。
也可以看看:
-
标准委员会关心的异国build筑 。
-
C和C ++中基于意见的整数types的实用观点 。
区别在于它们的准确性和可用性。
这里的文档说:
宽度分别为8,16,32和64位的无符号整型( 仅当实现直接支持该types时才提供 ):
uint8_t uint16_t uint32_t uint64_t
和
最快的无符号无符号整数types,宽度至less为 8,16,32和64位
uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
所以差别非常明显, uint32_t
是一个正好有 32
位的types, 只有在types正好是 32
位时,实现才会提供它,然后它可以将该types定义为uint32_t
。 这意味着, uint32_t
可能或不可用 。
另一方面, uint_fast32_t
是一个至less有 32位的types,这也意味着如果一个实现可以将uint32_t
为uint_fast32_t
如果它提供了uint32_t
。 如果它不提供uint32_t
,则uint_fast32_t
可以是任何types的至less有32
位的typedef。
当你在你的程序中包含#include inttypes.h
时,你可以访问许多不同的表示整数的方法。
uint_fast * _ttypes只是定义了代表给定位数的最快types。
这样想一下:你定义了一个short
types的variables,并在程序中多次使用它,这是完全有效的。 但是,您正在使用的系统可能会使用int
types的值更快速地工作。 通过定义一个types为uint_fast*t
的variables,计算机可以简单地select可以使用的最有效的表示法。
如果这些表示之间没有区别,则系统select它想要的任何一个,并始终如一地使用它。
请注意,快速版本可能大于32位。 虽然fast int会很好地适应寄存器并且被alignment等等,但是它会使用更多的内存。 如果你有大量的这些,你的程序会因为内存caching的命中和带宽的增加而变慢。
我认为现代的CPUS不会受益于fast_int32,因为一般情况下,32位到64位的符号可能会在加载指令期间发生,并且有一个“原生”整数格式更快的想法是老式的。