什么是 uint_fast32_t? 为什么要用它来代替常规的 int 和 uint32_t?

因此,使用 typedef: ed 原始数据类型的原因是为了抽象低级表示并使其更容易理解(uint64_t而不是 long long类型,后者为8字节)。

但是,有一个 uint_fast32_tuint32_t有相同的 typedef。使用“快速”版本会使程序更快吗?

64562 次浏览
  • 在某些平台上,int可能只有16位,这对于您的应用程序来说可能不够。
  • uint32_t不保证存在。它是一个可选的 typedef,实现必须提供它,如果它有一个正好32位的无符号整数类型。例如,一些有9位字节,所以它们没有 uint32_t
  • uint_fast32_t清楚地说明了您的意图: 它是一种 至少32位的类型,从性能的角度来看是最好的。uint_fast32_t实际上可能是64位长。这取决于执行情况。
  • 混合物中还有 uint_least32_t。它指定了至少32位长的 最小的类型,因此它可以小于 uint_fast32_t。如果平台不支持 uint32_t,那么它可以替代 uint32_t

uint_fast32_tuint32_t有相同的类型。

你看到的不是标准。这是一个特殊的实现(黑莓)。所以你不能从中推断出 uint_fast32_t总是和 uint32_t一样。

参见:

当您在程序中使用 #include inttypes.h时,您可以访问一系列表示整数的不同方法。

Uint _ fast * _ t 类型简单地定义了表示给定位数的最快类型。

可以这样想: 定义一个 short类型的变量,并在程序中多次使用它,这是完全有效的。但是,您正在使用的系统可能在使用 int类型的值时工作得更快。通过将变量定义为 uint_fast*t类型,计算机可以简单地选择它可以使用的最有效的表示形式。

如果这些表示之间没有区别,那么系统将选择它想要的任何一个,并在整个过程中始终使用它。

区别在于它们的准确性和可用性。

这里的 医生说:

无符号整数类型,其宽度分别为 没错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位。

请注意,快速版本可能大于32位。虽然快速 int 可以很好地适应寄存器,并且可以对齐,但是,它将使用更多的内存。如果你有大量这样的数组,你的程序会因为更多的内存缓存命中和带宽而变慢。

我不认为现代 CPU 会从 fast _ int32中受益,因为通常在加载指令期间会发生32到64位的符号扩展,而且有一种更快的“本机”整数格式的想法已经过时了。