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

时间:2011-12-14 07:11:15

标签: c++ c types

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

但是,uint_fast32_ttypedef具有相同的uint32_t。使用“快速”版本会使程序更快吗?

4 个答案:

答案 0 :(得分:115)

    在某些平台上,
  • int可能只有16位。它可能不适合您的申请。
  • uint32_t不保证存在。如果它具有正好为32位的无符号整数类型,则它是实现必须提供的可选typedef。例如,有些字节具有9位字节,因此它们没有uint32_t
  • uint_fast32_t清楚地说明了你的意图:它是一种至少 32位,从性能的角度来看是最好的。 uint_fast32_t实际上可能是64位长。这取决于实施。
  

... uint_fast32_tuint32_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位的符号扩展,并且存在更快的“本机”整数格式的想法是老式的。