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

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

但是, uint_fast32_tuint32_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_tuint_fast32_t 如果它提供了uint32_t 。 如果它不提供uint32_t ,则uint_fast32_t可以是任何types的至less有32位的typedef。

当你在你的程序中包含#include inttypes.h时,你可以访问许多不同的表示整数的方法。

uint_fast * _ttypes只是定义了代表给定位数的最快types。

这样想一下:你定义了一个shorttypes的variables,并在程序中多次使用它,这是完全有效的。 但是,您正在使用的系统可能会使用inttypes的值更快速地工作。 通过定义一个types为uint_fast*t的variables,计算机可以简单地select可以使用的最有效的表示法。

如果这些表示之间没有区别,则系统select它想要的任何一个,并始终如一地使用它。

请注意,快速版本可能大于32位。 虽然fast int会很好地适应寄存器并且被alignment等等,但是它会使用更多的内存。 如果你有大量的这些,你的程序会因为内存caching的命中和带宽的增加而变慢。

我认为现代的CPUS不会受益于fast_int32,因为一般情况下,32位到64位的符号可能会在加载指令期间发生,并且有一个“原生”整数格式更快的想法是老式的。