因此typedef
:ed原始数据类型的原因是抽象低级表示并使其更容易理解(uint64_t
而不是long long
类型,即8字节)。
但是,uint_fast32_t
与typedef
具有相同的uint32_t
。使用“快速”版本会使程序更快吗?
答案 0 :(得分:115)
int
可能只有16位。它可能不适合您的申请。uint32_t
不保证存在。如果它具有正好为32位的无符号整数类型,则它是实现必须提供的可选typedef
。例如,有些字节具有9位字节,因此它们没有uint32_t
。uint_fast32_t
清楚地说明了你的意图:它是一种至少 32位,从性能的角度来看是最好的。 uint_fast32_t
实际上可能是64位长。这取决于实施。...
uint_fast32_t
与uint32_t
具有相同的typedef ...
你所看到的不是标准。这是一个特定的实现(BlackBerry)。因此,您无法从那里推断uint_fast32_t
始终与uint32_t
相同。
另见:
答案 1 :(得分:33)
区别在于它们的准确性和可用性。
这里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位的类型,然后它可以键入该类型为uint32_t
的类型。这意味着,uint32_t
可能<或可能 。
另一方面,uint_fast32_t
是一种至少 32位的类型,这也意味着,如果某个实现可以将uint32_t
类型设置为uint_fast32_t
如果它提供uint32_t
。如果它不提供uint32_t
,则uint_fast32_t
可以是任何类型的typedef,其类型至少为32
。
答案 2 :(得分:2)
当您在程序中#include inttypes.h
时,您可以访问一系列表示整数的不同方法。
uint_fast * _t类型只是定义了表示给定位数的最快类型。
以这种方式思考:定义类型short
的变量并在程序中多次使用它,这是完全有效的。但是,您正在使用的系统可以使用int
类型的值更快地工作。通过将变量定义为类型uint_fast*t
,计算机只需选择可以使用的最有效的表示。
如果这些表示之间没有区别,那么系统会选择它想要的任何一个,并在整个过程中始终如一地使用它。
答案 3 :(得分:0)
请注意,快速版本可能大于32位。虽然fast int可以很好地适应寄存器并且可以对齐等等:但是,它会使用更多的内存。如果你有大量的这些数组,由于更多的内存缓存命中和带宽,你的程序将会变慢。
我认为现代CPUS不会受益于fast_int32,因为通常在加载指令期间可以发生32到64位的符号扩展,并且存在更快的“本机”整数格式的想法是老式的。